ToAscii
-
Hallo liebe C++ Gemeinde,
Ich habe nen' kleinen Keylogger geschrieben, der mir alles in eine Textdatei aufzeichnet. Das ganze wurde über einen LowLevelKeyboardHook realisiert. Das Problem dabei: er erkennt nicht wenn man Shift drückt (wodurch ganz andere Zeichen entstehen können)
z.B. 1: 1
shift und 1: +Ich benutze die Funktion ToAscii um mir den Char zurückzugeben, passend vom Keyboard-Code.
Darum meine Frage: Weiss jemand ob es eine Funktion gibt, die mir diese Tasten berücksichtigt? (Kann mir nicht vorstellen, dass jeder der mit der Tastatur arbeitet sowas manuell programmieren muss.)
Grüsse,
bleed_ch
-
GetAsyncKeyState kann es auf jedenfall aber das hat wenig mit Hooks zu tun.
Es sollte auch mit einem Hook gehen. Hast du VK_SHIFT abgefragt?
-
Mittlerweile habe ich den Problemherd entdeckt. Es liegt an GetKeyboardState() - diese Funktion greift nur wenn der Fokus gesetzt ist. Weil ich aber nen Prozess im Hintergrund laufen habe und die Tasten per systemweiter Hook abfrage, greift diese funktion nicht.
Ja, ich könnte natürlich manuell mit GetAsyncKeyState abfragen ob Shift gedrückt ist aber da gibt es ja noch ALT, CTRL, ALT GR.. kann ja nicht sein, dass jeder der mit der Tastatur arbeitet das manuell machen muss.
Gibt es keine Funktion die mir den KeyboardState unabhängig vom Fokus zurückliefert?
Hab sogar versucht nen eigenen KeyboardState-Array zu erstellen:
for (int i = 0; i < 256; i++) { keyStates[i] = GetAsyncKeyState(i); }Funktioniert aber nicht. Jemand 'ne Idee?
Grüsse,
bleed_ch
-
bleed_ch schrieb:
Ja, ich könnte natürlich manuell mit GetAsyncKeyState abfragen ob Shift gedrückt ist aber da gibt es ja noch ALT, CTRL, ALT GR.. kann ja nicht sein, dass jeder der mit der Tastatur arbeitet das manuell machen muss.
GetAsyncKeyState kann auch ALT usw., sieh dir die Doku mal an.
Ansonsten gibt es hier wahrscheinlich genug Threads, die dieses Thema behandeln. Vielleicht hilft das ein wenig weiter:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-97880.html
Sonst nutze die Suchfunktion.
-
Nichts für ungut _matze aber hättest du meine Frage genau gelesen hättest du bemerkt dass ich das genau nicht will.
Ich versuch mir meinen Array zu erstellen in dem der KeyboardState gespeichert ist, damit die Funktion ToAscii() regulär benutzbar ist.
Hab keine Lust mit 256 Keycodes jede Kombination und Möglichkeit aufzulisten.
for (int i = 0; i < 256; i++) { keyStates[i] = HIBYTE(GetAsyncKeyState(i)); }Funktioniert schonmal ganz prächtig. Bei gedrückter Shifttaste kommen die korrekten Zeichen raus. Nur beachtet er Caps-Lock und ALT-GR noch nicht (wie ich vermute hat das etwas mit dem LO(W)BYTE zu tun - den muss ich auch noch abfragen)
Wenn jemand kreativ mitdenken will kann er gerne nen Beitrag verfassen!
Grüsse,
bleed_ch
-
Benötigst Du wirklich GetAsynchKeyState, denn Windows hat ja schon GetKeyboardState/SetKeyboardState
http://msdn.microsoft.com/en-us/library/ms646299(VS.85).aspxSiehe auch:
http://blog.m-ri.de/index.php/2008/06/11/die-unsitte-getasynchkeystate-statt-geykeystate-zu-verwenden/
-
Ist es hier eigentlich Sitte die Beiträge nur zu überfliegen?

Der Grund für den Thread war doch gerade dass GetKeyboardState() bei einem Prozess (der im Hintergrund läuft und ein LowLevelKeyboardHook installiert) nicht funktioniert.
Mittlerweile benutz ich sowieso GetKeyState - schliesslich befind ich mich im CALLBACK vom Keystroke.
Grüsse,
bleed_ch
-
Sorry! Aber ich habe nur die letzten Postings gelesen.
In einem LowLevel Hook wird der KeyState IMHO noch nicht aktualisiert. Erst wenn die Nachricht aus der Queue gelesen wird, werden die entsprechenden Flags gesetzt. Siehe Doku zu GetKeyboardState
-
Allerdings. Nun habe ich es beinahe geschafft:
for (int i = 0; i < 256; i++) { keyStates[i] = GetKeyState(i); }keyStates ist dann ein reguläres Array mit dem Zustand der Tasten (wie von GetKeyboardState())
Das letzte Problem das besteht ist, dass wenn man Zeichen wie "^" schreibt (die eigentlich 2 Keydowns erfordern damit sie angezeigt werden) sofort nach einem angezeigt werden und zwar doppelt.
aus "^" wird "^^" und zwar schon nach dem ersten Tastendruck.
aus "`" wird "``",
aus "¨" wird "¨¨" und das alles passiert beim Aufruf von ToAscii() - wenn ich es weglasse verhält er sich normal.Wie kann ich denn dieses komische Verhalten korrigieren?
Grüsse,
bleed_ch