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...


Anmelden zum Antworten