ToAscii + Shift und alternative Zeichen/Buchstaben
-
Soll u.a. nen Keylogger beinhalten.
Hab mal den Code von denen angeschaut, die haben nur statt meinem lparam ne 0 als Parameter,
habe das mal bei mir versucht, allerdings ohne Erfolg, es bleibt exakt gleich
-
Falls die komischen Zeichen dahinter gewesen wären hätte ich gesagt, dass du einfach den Buffer vorher mit Nullen füllen musst, aber so fällt mir auch nichts ein

-
Schade

Wo könnt ich, denn noch Fragen? Kenn sonst kein Forum wo so viele kompetente Leute sind

-
SirLant schrieb:
Schade

Wo könnt ich, denn noch Fragen? Kenn sonst kein Forum wo so viele kompetente Leute sind
im usenet z.b. bei microsoft.win32.programmer o.ä.
-
Im Usenet konnte mir auch keiner helfen.
Aber ich weiß jetzt wo der Fehler liegt

Die Funktion GetkeyboardState liefert nur den Status der VKEYS für die betreffende Message Queue und
da ich ja fremde VKEYS abfange hat mein GetKeyboardState natürlich keine gültigen Werte.Sobald ich tippe wenn meine GUI den Fokus hat funktioniert es nämlich.
Ich bin mir noch nicht so sicher wie man das jetzt lösen kann, ich kann mir ne eigene
ToAscii Funktion basteln, wäre ja kein Problem die VKEYS bekomme ich ja, aber
ich weiß halt nicht ob die Shift Taste gedrückt wird, da ich nur beim drücken
1mal Informatiert werde, aber nicht wann sie losgelassen wird, oder ob sie noch
aktiv ist. Gleiches gilt für die Alt Taste.Gibts denn keine Funktion die mir den echten Keyboard-Status gibt?
-
Evtl. kannst du mit GetAsyncKeyState was anfangen

-
An der Funktion bin ich gerade, nur verwende ich GetKeyState, allerdings hab ich keine
Ahnung wie ich an das high order und low order bit komme
So Bitspielereien waren noch nie meine stärke und ich bin mir nicht mal sicher wo die sitzen, man muss ja noch little und big enidan beachten
-
Einfach mit &
Afaik dann z.B. so:if(dwValueToCheckHighBit & 0x80000000) { // [...] }
-
Ja das wusst ich noch, nur hab ich keine Ahnung welches von den 16Bit das höchste und welches das kleinste ist *g*
Edit:
Ah jetzt ist es mir wieder eingefallen, da nen normaler pc ja little endian hat,
ist es einfach das letzte Bit
Edit:
Also mit GetKeyState funktioniert es teilweise, aber mit GetAsyncKeyState steht in meiner log
[else]Ì => 204
[VK_SHIFT gesetzt] => %
[VK_SHIFT gesetzt] => %
[VK_SHIFT gesetzt] => %Da freut man sich doch ....
.... jedenfalls bis einem einfällt, dass man das jetzt nicht nur für das %-zeichen
sondern für noch viele andere machen muss
-
Nach einiger Tüftelei kam ich auf die geniale Idee einfach den Puffer mit den Daten der Tasten
vor einem Aufruf von ToAscii zu ändern.Glücklicherweise stehen VK_SHIFT, VK_RMENU und VK_CAPITAL an den Stellen im Puffer wie ihre
Wertigkeit ist.ich dachte mir, dann schreib ich einfach vor ToAscii
if (GetAsyncKeyState (VK_SHIFT) & 0x8000) buf[VK_SHIFT] = 0x80; //wenn höchstes Bit gesetzt ist, ist die Taste gedrückt if (GetAsyncKeyState (VK_RMENU) & 0x8000) buf[VK_RMENU] = 0x80; //Alt Gr gedrückt if (GetAsyncKeyState (VK_CAPITAL) & 0x8000) buf[VK_CAPITAL] = 0x81; //Das niedrigste Bit signalisiert "toggeln"Das Ergebnis ist aber total Müll und nicht wie erwartet die richtigen Zeichen.
Jetzt die Frage, hab ich was falsch verstanden bei der Beschreibung von GetKeyboardState
When the function returns, each member of the array pointed to by the lpKeyState parameter contains status data for a virtual key. If the high-order bit is 1, the key is down; otherwise, it is up. If the key is a toggle key, for example CAPS LOCK, then the low-order bit is 1 when the key is toggled and is 0 if the key is untoggled. The low-order bit is meaningless for non-toggle keys. A toggle key is said to be toggled when it is turned on. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
Edit:
Ok ich hab es jetzt hinbekommen

Für alle die es interressiert:
BYTE buf[256]; WORD ch; UINT scancode = 0; GetKeyboardState (buf); buf[wparam] = 0x80; //Die gedrückte Taste muss von "hand" reingeschrieben werden if (GetAsyncKeyState (VK_SHIFT) & 0x8000) //Wenn Shift gedrückt wird einfügen buf[VK_SHIFT] = 0x80; ToAscii (wparam, scancode, &buf[0], &ch, 0);