Keyboard Scancodes
-
Hallo,
ich kennen bei einem Tastendruck
- Tastatur scancode
- NumLock an/aus
- CapsLock an/aus
- linke und recht Shift-Taste gedrückt ja/nein
- linke und recht Control-Taste gedrückt ja/nein
- linke und recht Alt-Taste gedrückt ja/nein
kennt jemand einen Weg das in ein "lesbares" Zeichen umzuwandlen?
z.B.
CapsLock aus + Shift gedrückt + Taste5 = %Das einzige das mir eingefallen ist, wäre die Eingaben zu simulieren was ich aber eigentlich vermeiden möchte.
vielen Danke schon einemal im vorraus

cya
-
WM_CHAR (du brauchst TranslateMessage() in deiner MessageLoop)
-
Danke mal für deine Antwort!
Aber das Problem ist, das ich diese Tastatureingaben nicht selbst bekommen. Ich lese die Daten aus einer Log eines anderen Programms aus, das im Kernel (Mode) arbeitet und deshalb kein Zugriff auf lokal Einstellungen hat. Nun möchte ich diese im User Bereich je nach lokaler Tastatureinstellung ausgeben.
-
Achso, jetzt versteh ich die Frage auch richtig.
Das müsste mit TranslateMessage funktionieren. TranslateMessage macht, wenn ich mich nicht irre, genau das was du willst, allerdings für WM_KEYDOWN-Nachrichten. Die Struktur, die TranslateMessage erwartet kannst du ja so befüllen, als würde eine WM_KEYDOWN-Nachricht vom System generiert werden. Also für 'message' gibst du WM_KEYDOWN an, 'hwnd' is egal, 'time' und 'pt' auch. In 'wParam' hat WM_KEYDOWN den Key-Code und in 'lParam' sind die anderen Informationen, die du ja hast (hier findest du das genaue Format [vieleicht ist es bei dir ja schon so gespeichert] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputmessages/wm_keydown.asp ).Kann sein, dass das auch einfacher geht, wüsste jetzt aber nicht wie.
-
ok, thx mal
aber da Problem ist, irgendwie krieg ich das nicht richtig simuliert ob Shift, Alt, NumLock usw. gedrückt sind
Das leifert ein kleins "r" obwohl es wegen Shift, ein großes "R" sein müsste...
HWND hWnd = CreateWindow( "EDIT", NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL ); char cChar; GetChar( &cChar, hWnd, 0x13, false, false, true, false, false, false, false, false ); bool GetChar( char *pOutChar, HWND hWnd, UINT nScanCode, bool nNumLock, bool bCapsLock, bool bLShift, bool bRShift, bool bLCtrl, bool bRCtrl, bool bLAlt, bool bRAlt ) { MSG Msg = { 0 }; UINT nVirtKey; Msg.hwnd = hWnd; Msg.message = WM_KEYDOWN; // modifiers if( bLShift ) { Msg.wParam = VK_LSHIFT; Msg.lParam = 0x2a >> 16; TranslateMessage( &Msg ); } // ... // key nVirtKey = MapVirtualKey( nScanCode, 1 ); Msg.wParam = nVirtKey; Msg.lParam = nScanCode >> 16; TranslateMessage( &Msg ); // get char from message if( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE ) ) { if( Msg.message == WM_CHAR ) { *pOutChar = (char)Msg.wParam; return true; } } return false; }
-
Mmmhh, habs jetzt auch mal probiert, so geht es wohl wirklich nicht
. Ich hab aber noch eine Idee, wie wärs mit einer Tabelle? Wenn (Shift xor CapsLock)==1 wird in der Tabelle für Großbuchstaben das Zeichen zum Scancode rausgesucht und sonst in der Tabelle für Kleinbuchstaben, evtl. noch eine Sonderbehandlung für Alt Gr und Numlock. Dann hast du schon mal das Meiste. Vieleicht kriegt man so ne Tabelle auch mit ner Windowsfunktion, sonst würde es ja nur für deutsche Tastaturen funktionieren.
-
Also für die standard AT-101/102 Tastatur und standard layout (US) hab ich mir so eine Tabelle schon gebastelt - die Definitionen bietet Mircrosoft, da gibts auch keine Sonderbehandlung für AltGr (Right Alt) ist wohl eine allein nicht englische Sache.
Aber das Problem sind dann wieder die anderen Sprachen, es sollte am besten auf anderen oder am besten allen Sprachen laufen.Solche eine Tabelle für die Sprache wäre auch besser als so rumzutricksen, aber ich habe keine Ahnung, wo unter Windows ich die Tabelle finden kann, die gerade aktiv ist.