Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0070: Tastatur systemweit überwachen

 von 

Beschreibung 

Um die Tastatureingaben außerhalb des eigenen Projektes abfragen zu können, bietet VB leider keine Hauseigenen Mittelchen. Jedoch läßt sich durch etwas umständliches Gebastele soetwas durchaus realisieren.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

GetAsyncKeyState

Download:

Download des Beispielprojektes [2,35 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Textfeld "Text1"

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" _
        (ByVal vKey As Long) As Integer

Private Sub Timer1_Timer()
    Dim X As Long
  
    For X = 48 To 90
        If CompKey(X, UCase(Chr$(X))) Then Exit Sub
        If CompKey(X + 48, UCase("NUM " & Chr$(X))) Then Exit Sub
    Next X
    
    If CompKey(8, "BACKSPACE") Then Exit Sub
    If CompKey(9, "TAB") Then Exit Sub
    If CompKey(13, "ENTER") Then Exit Sub
    If CompKey(16, "SHIFT") Then Exit Sub
    If CompKey(17, "STRG") Then Exit Sub
    If CompKey(18, "ALT") Then Exit Sub
    If CompKey(19, "PAUSE") Then Exit Sub
    If CompKey(27, "ESC") Then Exit Sub
    If CompKey(33, "PAGE UP") Then Exit Sub
    If CompKey(34, "PAGE DOWN") Then Exit Sub
    If CompKey(35, "ENDE") Then Exit Sub
    If CompKey(36, "POS1") Then Exit Sub
    If CompKey(37, "LEFT") Then Exit Sub
    If CompKey(38, "UP") Then Exit Sub
    If CompKey(39, "RIGHT") Then Exit Sub
    If CompKey(40, "DOWN") Then Exit Sub
    If CompKey(44, "DRUCK") Then Exit Sub
    If CompKey(45, "INSERT") Then Exit Sub
    If CompKey(46, "DEL") Then Exit Sub
    If CompKey(144, "NUM") Then Exit Sub
    If CompKey(145, "ROLLEN") Then Exit Sub
    
    For X = 112 To 127
        If CompKey(X, "F" & CStr(X - 111)) Then Exit Sub
    Next X
    
    ' usw... usw...
End Sub

Private Function CompKey(KCode As Long, KText As String) As Boolean
    Dim Result As Integer
    
    Result = GetAsyncKeyState(KCode)
    If Result = -32767 Then
        Text1.Text = Text1.Text & "[" & KText & "]" & vbCrLf
        Text1.SelStart = Len(Text1.Text)
        CompKey = True
    Else
        CompKey = False
    End If
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Wo kommt der Befehl, - Basis 2 24.06.13 09:29 12 Antworten

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 40 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Yannick am 09.05.2009 um 21:19

Hallo, kann ich vielleicht eine abgeänderte Form an meine email addresse erhalten in der dieser Keylogger in einer Excel Tabelle eingearbeitet ist wo mann auf ein textfeld klicken muss und dann ab dem zeitpunkt alle gedrückten tasten in eine datei gespeichert werden und an meine Email geschickt werden sobald die datei größer als 2 mb ist?

Kommentar von jac am 08.08.2008 um 01:52

danke, hat mir sehr geholfen
muss nur bei den anderen kommentaren etwas schmunzeln
ich bin erst 14, hab es aber geschafft, das teil hier so umzuschreiben, dass es perfekt auf meine anwendung passt

und an den vorposter:
CompKey ist nur dafür da, um die Tasten auch im Text1 ausgeben zu können
wenn du das aber, wie die meisten wohl gar nicht brauchst, lösch das ganze viech einfach genau wie eigentlich alles andere, das einzige was du brauchst ist

Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer


klaro?

Kommentar von x am 29.05.2008 um 17:07

Warum ist das Beispiel in Pascal und nicht in C??

Kommentar von Laurin Rother am 02.11.2007 um 01:11

Hi Hacker/Anfaenger

bin gerade nen bisschen zeit, ansonsten aber fragen zum source besser im forum posten :)

nun zum problem:

Es ist denkbar einfach. Der wichtigste Part steckt in dem folgenden Aufruf. Die Funktion wird ganz am anfang der form deklariert.

GetAsyncKeyState(KCode)


Beispiel:
If CompKey(8, "BACKSPACE") Then Exit Sub

Wenn nun die Taste mit dem entsprechenden KCode (Keycode, im Beispiel 8) gepresst wird, liefert die funktion -32767 zurueck. Das wird abgefragt. Falls es zurueckgegeben wird, schreibt die Funktion CompKey den Parameter KText (im Beispiel "BACKSPACE" in die Textbox textbox1. Anschliessend liefert die Funktion ausserdem ein boolschen Wert, der angibt, ob die Taste gedrueckt wird, oder nicht. Wenn die funktion true zurueckliefert, ist der wert in der IF-Abfrage true, und der part nach "then" wird ausgefuehrt. In diesem Beispiel wird die schleife abgebrochen, und der Prozess beginn mit dem naechsten TimerEvent wieder von vorne.

Was tut das ganze TimerEvent?

In Allgemeinen, fuettert sie einfach die Funktion CombKey mit allen Tasten auf der Tastatur, die gedrueckt werden koennten (nicht wirklich alle, aber die schleife kann einfach ergaenzt werden, indem man alle werte zwischen 0 und 255 abfragt.

Wenn du einfach nur wissen willst, ob IRGENDEINE taste gedrueckt wurde, nutze folgenden code.


Dim i As Integer
For i = 0 To 255
If GetAsyncKeyState(i) = -32767 Then
msgbox "Es wurde mal wieder eine Taste gedrueckt. Key Code ist " & i & "."



Ich hoffe ich konnte helfen.

PS: bin gerade in Amerika. Bitte entschuldigt mein schlechtes Deutsch :P

Kommentar von Hacker/Anfänger am 01.11.2007 um 21:56

Sry aber könnte es mir jemad genauer erklärn bligg grad garnicht durch ^^

Kommentar von Sabine Mecklenburg am 16.05.2007 um 15:14

Ich möchte den user die Möglichkeit geben, eine länger dauernde Prozedur/Berechnung mit esc abzubrechen.
Aber unter VB.Net 2005 funktioniert das mit GetAsyncKeyState(27) nicht so richtig. D.h. wenn das Formular läuft und ich drücke esc, funktionierts,GetAsyncKeyState(27) gibt -32767 zurück.
Aber wenn ich mein Unterprogramm starte und drücke dann irgendwann die esc Taste gibt GetAsyncKeyState(27)immer 0 zurück.
Wie kann ich das Problem lösen?

Kommentar von adam am 08.01.2007 um 12:19

Hallo,
mit VB6 läuft das ganze ja wundebar. Aber wie könnte sowas in .NET aussehen?

Kommentar von Andreas Bender am 08.12.2006 um 11:04

Super!

Ich benutze es in etwas abgewandelter Form um zu überprüfen, ob irgend eine Taste gedrückt wurde.
Diese Information wird dann regelmäßig über winsock
an einen oder mehrere Rachner im lan geschickt und wir
wissen, dass der Mitarbeiter der alleine in der anderen Halle arbeitetr nich Lebt und wohl auf ist :))

Nur mal so als Beispiel dass es noch andere Nutzungsmöglichkeiten als Keylogger dafür gibt.


Herzlichen Dank!

Kommentar von RuckZuck am 29.06.2006 um 17:29

... also wenn Du fast keine Ahnung hast, würde ich Dir doch eher hierzu raten: http://www.keelog.com/order.php

Kommentar von FTP am 29.06.2006 um 15:37

Ich habe eine frage ich habe keine grosse programier fähikeiten aber ich wil einen keylogger mit Microsoft Visual Basic 6.0 machen damit ich z.b bei Habbo Hotel passwörter herausfinde. Kann mir jemand erklären wie das geht?

p.s ich habe fast keine ahnung also erklärt es mir guet ;D

Kommentar von Hans-Jürgen am 18.05.2006 um 08:11

In diesem Beispiel werden die Zeichen abgefragt. Gibt es eine Möglichkeit direkt den Scan Codes der Tastatureingabe ab zu fragen?

Kommentar von is doch egal am 19.01.2006 um 20:02

DANKE KLAPPT

Kommentar von Carsten Schupmehl am 05.12.2005 um 15:58

Funktioniert nur teilweise unter VB6 und W2K !!!

Wenn bestimmte Programme geöffnet sind werden die tasten nicht aufgezeichnet ! (MS-Excell Word

Kommentar von RuckZuck am 26.10.2005 um 02:01

Hallo zusammen! Entgegen der Angabe, die Routine laufe nicht unter Win98 gibt's bei mir keinerlei Probleme. Auf einem PC mit Win98, aber ohne VB, muss sich die Bibliothek "MSVBVM60.DLL" im Systemverzeichnis befinden. Durch Zugriff auf die VBKeys der API erspart man sich das Suchen nach dem Keycode, wenn man nicht alle Kombinationen einbinden möchte. So lässt sich GetAsyncKeyState(65) durch GetAsyncKeyState(vbKeyA) oder GetAsyncKeyState(17) durch GetAsyncKeyState(vbKeyControl) ersetzen. Diese lassen sich per F2 Nun zu einem Problem, das mir auf dem Herzen liegt: Ich mochte in einem Spiel eine Aktion durch Drücken der Steuerungs-Taste auslösen. Das Ganze funktioniert bei mir 100%ig unf fehlerfrei. Nun habe ich einem Freund aus Italien mein Tool geschickt, aber dort weigert sich das Programm vehement, eine Tastatureingabe zu akzeptieren. Als es weder mit '(vbKeyControl)' noch dem KeyCode '(17)' lief, habe ich es auch mit '(vbKeyA)' und KeyCode '(65)' versucht. Da er seinen Laptop benutzt wollte ich damit ausschliessen, dass die kleinere Tastatur evtl. andere Keycodes für die Sondertasten verwendet (gibt ja auch eine FN-Taste und jede Menge Mehrfachbelegungen), wobei das 'A' definitiv genormt sein sollte. Er verwendet Windows XP in Italienischer Sprache und hat die VB6-Laufzeitbibliothek in seinem System32-Verzeichnis. Vielleicht hat ja jemand eine Idee, ob das ein länderspezifisches Problem ist oder vielleicht durch eine Einstellung in den Tiefen der wirren administrativen und optionalen Vorgabe-Sicherheits-Parameter ;-) verhindert wird. Bin für jede Hilfe dankbar! Nachfolgend mein letzter Versuch, der scheiterte:

Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Private Const KeyPressed As Integer = -32767

Sub Timer1()
If GetAsyncKeyState(vbKeyX) = KeyPressed Then
MsgBox "Taste gedrückt"
End If
End Sub

Kommentar von Paratron am 21.08.2005 um 19:56

Tastenkombis sind nur kein Problem, wenn man die Tasten wirklich GLEICHZEITIG drückt. Wenn die Kombi aber aus drei Tasten besteht ist das nie der Fall, sondern die "Drückzeit" bis alle drei Tasten unten sind dauert bis zu einer Sekunde. Und bis dahin hat die API die Erste Taste schonwieder "vergessen".

Kommentar von psh am 21.08.2005 um 15:40

Nochmals ich =)
Mit dem Tipp lässt sich nicht nur die Tastatur, sondern auch die Maus global abfangen:
1: Linke Maustaste
2: Rechte Maustaste
4: Mittlere Maustaste

@Paratron: Tastenkombinationen abfangen scheint kein grösseres Problem zu sein:

If GetAsyncKeyState(17)<0 And GetAsyncKeyState(83)<0 Then Msgbox "Ctrl+S gedrückt."
If GetAsyncKeyState(91)<0 And GetAsyncKeyState(16)<0 And GetAsyncKeyState(27)<0 Then MsgBox "Windowstaste+Shift+Escape gedrückt"

Kommentar von psh am 21.08.2005 um 15:22

Damit kann man sogar diese Spezialtasten auf der Tastatur abfragen (Play/Pause, Stop, usw.). Habe gerade eine App geschrieben damit ich mit diesen Tasten iTunes systemweit steuern kann (iTunes hat eine geniale Schnittstelle dafür).

Kommentar von Paratron am 02.08.2005 um 21:47

Der Tipp ist ganz gut.
Wenn man die Abfrageschleife durch

For X = 0 To 250
If CompKey(X, UCase(Chr$(X))) Then Debug.Print "Keycode: " x
Next X

ersetzt kann man sich ALLE KeyCodes von ALLEN Tasten ausgeben lassen. Auch Win-Key, punkt-Komma, etc...

Was mich aber SEHR stört: Wenn ich eine Taste gedrückt halte rafft das die API nicht. Sie zeigt nur kurz an "Taste gedrückt" (im übertragenden Sinne ;) ) und dann wieder nichts mehr. Das ist blöd, weil ich gerne Tastenkombies abfangen will.

Kommentar von bluebird am 22.06.2005 um 14:05

Wie lese ich Kommas und Punite aus?

Kommentar von Stefan am 19.06.2005 um 17:36

Den Code find iche cht klasse! Diesen kann man sogar mit VisualBasic.Net umcompilieren lassen und der funktioniert danach sogar noch, was meistens nicht der Fall ist!
Großes Lob an den Programmierer!

Kommentar von am 24.04.2005 um 16:56

Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer

Private Sub Timer_Timer()
'116 = Keycode für F5
If GetAsyncKeyState(116) = -32767 Then MsgBox "F5 gedrückt"
End Sub

Private Sub Form_Load()
Timer.Interval = 1
Timer.Enabled = True
End Sub


So ist etwas kürzer ;)

Wenn ihr mehrere überwachen wollt müsst ihr die erste taste die gedrückt werden soll zuletzt überprüfen ^^

zB.
If GetAsyncKeyState(117) = -32767 and F5 Then MsgBox "F5 und dann F6 gedrückt"
If GetAsyncKeyState(116) = -32767 Then F5 = true

glaube ich, probierts aus ;)

Kommentar von skaix am 01.04.2005 um 00:19

okok alles klar über des prog aber wie bekomm ich den resault von bestimmten tasten raus das heiß doch dass
-32767 für alle tasten steht aber was steht für enter?

Kommentar von Faco am 13.12.2004 um 16:34

Genialer Tipp!
Warum kann ich allerdings keinen Punkt oder das Komma auslesen?

Kommentar von cyberfish am 09.12.2004 um 19:17

hallo leute,

bei mir funktioniert der tipp ganz prächtig,

aber kann mir einer sagen wie der entsprechende Befehl für die windowstaste aussieht????????

Kommentar von R2D2 am 02.04.2004 um 20:18

wie bringt man das Programm dazu auch bei geöffneten Programmen mitzuschreiben ??????? und wie kann ich diese in eine versteckte Datei bringen ???????

Kommentar von modem am 15.09.2003 um 14:13

CompKey ? wie finde ich denn weitere tasten raus? z.B SPACE ?!

Kommentar von BreakerMaker am 16.07.2003 um 14:27

Was habt ihr man!!!??
Die Geschwindigkeit ist Hammer. Mein Keylogger (6 monate alt) benutzt die selbe API.
Damals habe ich wie'n verrückter nach den infos gesucht. ihr habt das glück das hier vor die nase gesetzt zu bekommen und meckert immer noch!
also bei mir: ich tippe bis an die grenzen der menschlichen tippgeschewindigkeit und er fängt alles ab.
(vielleicht habt ihr den timer.interval auf 1000 gestellt. DANN WUNDERT EUCH NICHT :)

Kommentar von am 21.01.2003 um 17:25

mann das programm ist einfach Affen Geil ( sory für den Ausdruck)
man ihr habt mir einen traum erfüllt

Kommentar von Walde am 08.01.2003 um 14:55

Also ich hänge nun seit ca. einer Stunde an dem Programm und ich denke ich habe verstanden was hier gemacht wird. Da ich mir aber nicht sicher bin wollte ich nochmals nachfragen...
Das Programm vergleicht durch die timer schleife, indem es zu jeder zahl aufgerufen wird, die aktuelle zahl und die durch windows eingefangenes Key und wenn es dann zutrifft, dann wird dies auch ausgegeben. Ist das Korrekt? Statt der kleinen Buchstaben wird ein SHIFT und dann der Grossbuchstabe ausgegeben. Das Programm schleicht da ein Timer die ganze Zeit takten muss um auch die aktuellen Buchstaben zu erhalten. Bin bis jetzt nur so weit gekommen, doch falls jemand mehr rauslesen kann.....schreiben. Walde

Kommentar von Stefan am 17.10.2002 um 20:19

Ich check das nicht, kannst Du mir das bitte erklären? (Tip 70)
(funktioniert irgendwie auch nicht, VB6.0 SP5 Win XP)
Bin noch anfänger in VB, und versuche mich mit Übungsprojekten voranzuarbeiten...

Kommentar von bluff am 11.07.2002 um 10:13

Vool der Schrott, fiel zu landsam.
lest faßt jeden buchstabem aus und ist voll der bullshit

Kommentar von Buschfunker1234 am 04.06.2002 um 15:28

Ist das Prog nur bei mir so landsam oder ist das normal. Bei schnelleren Tastatureingaben werden Buchstaben ausgelassen.

Kommentar von Kurt am 10.04.2002 um 15:14

Hallo ich wollte mal fragen, was das "und so weiter" bedeuten soll! Kann mir jemand hier helfen? aber nicht an die e-mailadresse schreiben, weil die meinem Vater ist!
Danke
Kurt

Kommentar von Hendrik Jordt am 30.03.2002 um 17:26

George Orwell lässt grüssen...

Kommentar von TheSpy am 12.11.2001 um 15:21

Danke für den Tip! Funktioniert 1A!!! Hab mir daraus ein kleines Protokoll-Proggi gebastelt. Endlich kann ich mal nachvollziehen, was mein Kollege an MEINEM PC für dumme Sachen schreibt...

Kommentar von Occulator am 08.11.2001 um 17:47

Hab vergessen, wie man Tasten (am Keyboard) Ereignisse zuweist (Keyleft..)
wie ging das noch mal?

Kommentar von Hermann Bruns am 06.02.2001 um 22:14

Ich schließe mich den Urteilen der anderen an: Diese VB-Seite ist wirklich Klasse.
Nun zu meinem Problem: Unter VBA-Word 2000 funktioniert dieses Programm nicht. Ich habe alles versucht. Kann es sein, dass VBA-Programme unter Word nicht den Input-Fokus für Tastaturereignisse erhalten und somit nicht von der Tastatur "ansprechbar" sind?

Kommentar von Götz Reinecke am 18.11.2000 um 16:14

Pardon aber die Tips sind keine fertigen Anwendungen, das würde auch den Rahmen sprengen, sondern Beispiele die das Prinzip zeigen sollen. Wenn Du Unterscheidung zw. groß/klein wünschst und keine Tastenwiederholung mußt Du Dir den Code natürlich dementsprechend anpassen.

Kommentar von Star2000 am 18.11.2000 um 16:06

Die Buchstaben werden aber alle in Großbuchstaben ausgegeben und wenn eine Taste gedrückt gehalten wird, dann wird sie mehrmal notiert.

Kommentar von Daniel am 13.10.2000 um 22:28

Erstmal ein ganz grosses Lob an euch!!! Das ist bis jetzt die beste Seite die ich im Netz über VBasic gefunden habe. Hier kann man fast alles finden und es ist auch alles mit Beispielen und Erklärung.
Was mich besonders interessiert ist euer Tip 70. Nur leider kann ich den Abschnitt Private Function CompKey- kaum nachvollziehen. Könntet ihr mir vielleich jede einzelne Zeile beschreiben und mir alles dann als Mail schicken? Das wäre echt toll von euch. Vielen Dank!!!
Daniel