Merkwürdiges Verhalten von DWORD bei DirectInput
-
Hallo,
Ich hab auf einer anderen Seite eine Funktion gefunden, die mir zu einem
DirectInput-Code (DIK_...) den entsprechenden Ascii-Code liefert, damit man
DirectInput auch mit unterschiedlichen Keyboard-Layouts benutzen kann.
Hier ist diese Funktion:UINT8 Scan2Ascii(DWORD dScanCode) { static HKL Layout = GetKeyboardLayout(0); static UINT8 State[256]; UINT16 Result; GetKeyboardState(State); UINT32 VK = MapVirtualKeyEx(dScanCode,1,Layout); if (ToAsciiEx(VK,dScanCode,State,&Result,0,Layout) == 0) Result = 0; return (UINT8)Result; }Jetzt hab ich mir eine Gegenfunktion dazu geschrieben, die mir zu einem
Ascii-Code den richtigen Scancode liefert, damit ich einfacher überprüfen kann,
ob eine Taste gedrückt wurde:DWORD Ascii2Scan(int iAscii) { int iMin = 0x01; // 0x01 ist der kleinste Wert der DIK_ Konstanten int iMax = 0xED; // 0xED ist der größte Wert DWORD dValue = 0; for (int i = iMin; i <= iMax; i++) { if (Scan2Ascii(i) == iAscii) { dValue = i; break; } } return dValue; }Die Sache ist die: Wenn ich Ascii2Scan mit den unterschiedlichsten Parametern
aufrufe, z.B. '(', '?', 'Y' etc.. dann springt die Funktion laut Debugger nicht
in die if-Anweisung, d.h. es wird 0 zurück gegeben.
Bei kleinen Buchstaben wird in die Anweisung gesprungen.Das komische an der Sache ist jetzt aber, wenn ich folgendes mache:
if (KeyPress(m_KbBuffer, Ascii2Scan('('))) MessageBox(NULL, "Hallo", NULL, NULL);dann klappt es sowohl bei '(', bei '?' und bei 'Y', obwohl jedes Mal
0 zurück gegeben wird. Eigentlich dürfte es doch nur bei Kleinbuchstaben
klappen.
Wie kann das denn sein?!Gruss,
Norman
-
DirectInput macht keinen Unterschied zwichen Groß- und Kleinbuchstaben.
Das bleibt dem Client überlassen. So müsstest du für 'A' prüfen ob [A] + [Shift] gedrückt wurde.
-
Ja, das ist gerade das, was mich so wundert.
Mein Programm erkennt ja, ob ich 'z' oder 'Z' eingebe,
aber eigentlich dürfte es das nicht. Und das komischste ist,
dass der Rückgabewert der Funktion Ascii2Scan bei beiden
Aufrufen gleich ist, aber die KeyPress-Funktion erkennt
trotzdem die Unterschiede...