Tastatur-Hook soll auch die Zeichen "@", "[", etc. verarbeiten



  • Hallo liebe Forumsleser,

    nun mein dritter Anlauf meines Problems....

    Die im Titel genannten Zeichen sind auf der deutschen Tastatur ja über die "AltGr" Taste erreichbar.
    Aber unter einer anderen Sprache geht es ev. über "Shift" oder weiss Gott wie.

    Ich habe aus dem Netz ein Beispiel für einen Hook, der eigentlich die Sprache berücksichtigen sollte.
    Ich mache es über den LowKeyboard-Hook.
    Aber ich komme einfach nicht an diese Zeichen ran, während die Umsetzung von Zahlen sowie Klein u. Grossbuchstaben funktioniert, auch in anderer Sprache.
    PS: Für die Umschaltung Klein/Gross merke ich mir das "Shift" selbst und subtrahiere "32". Also eigentlich auch Scheisse.
    Aber über den Scancode und "ToAsciiEx(..)" funktioniert es bei mir nicht.

    Kann mir bitte jemand sagen, wie ich an die anderen Zeichen rankomme?

    Übrigens arbeite ich mit einem Bacode-Scanner und habe für aktuellen Fall kein Formular mit Edit-Control!



  • Ergänzung:

    Meine Function "scan2ascii(..)" ist dieselbe, die auch an anderer Stelle im Netz zu finden ist, Standard eben.
    Und ich habe schon versucht, durch explizites Setzen der "State"-Variablen, einem Zeichen ein "Shift" mitzugeben.
    Hier mein Quellcode:

    static int scan2ascii(DWORD scancode, USHORT* result, BOOL bIsStart)
    {
    	UINT vk;
    	BYTE State[256];
    	HKL layout = GetKeyboardLayout(0);
    	ZeroMemory(State, sizeof(State));
    
    
    	if (GetKeyboardState(State) == FALSE)
    		return -1;
    	vk = MapVirtualKeyEx(scancode, 1, layout);
    
    	if ((g_dwBC_ReaderLastSign == VK_LSHIFT) || (g_dwBC_ReaderLastSign == VK_RSHIFT)) {
    		TRACE(_T("++++++++ scan2ascii: KBD-Shift LastSign: %d\n"), g_dwBC_ReaderLastSign);
    		State[g_dwBC_ReaderLastSign] = State[g_dwBC_ReaderLastSign] | 128;  // das HI-Bit setzen!
    	} // ... Dasselbe natürlich auch für "VK_MENU" u. "VK_CONTROL"
    
    	return ToAsciiEx(vk, scancode, State, result, 0, layout);
    }
    

    Ich bin inzwischen in Verzweiflung versunken.
    Ich habe zwar auch an anderer Stelle im Netz die identische Frage gefunden, aber ohne Antwort.

    Weiss den niemand, wo da der Fehler liegt?



  • Nun, nach einer Woche Rumrätseln, ist mir was aufgefallen.

    Es gibt ja nicht nur die VK-Keys für rechte u. linke Taste von "Shift" oder "Ctrl", sondern zusätzlich noch die allgemeinen Tasten dazu.
    Also es gibt auch "VK_SHIFT", "VK_CONTROL", ...

    Wenn man nun nicht nur die eine gedrückte Taste setzt, sondern auch noch die allgemeine, dann funktioniert es!

    	if ((g_dwBC_ReaderLastSign == VK_LSHIFT) || (g_dwBC_ReaderLastSign == VK_RSHIFT)) {
    		TRACE(_T("++++++++ scan2ascii: KBD-Shift LastSign: %d\n"), g_dwBC_ReaderLastSign);
    		State[g_dwBC_ReaderLastSign] = State[g_dwBC_ReaderLastSign] | 128;  // das HI-Bit setzen!
    		State[VK_SHIFT] = State[VK_SHIFT] | 128;  // das HI-Bit setzen!
    	} // ... Dasselbe natürlich auch für "VK_MENU" u. "VK_CONTROL"
    


  • hast du mal versucht, die 1 bei MapVirtualKeyEx durch MAPVK_VK_TO_CHAR zu ersetzen?



  • @Wade1234
    Hallo Wade1234,

    vielen Dank für Deine Anmerkung.
    Ich habe mir die Parameter für "MapVirtualKeyEx(..)" eigentlich schon genau angesehen.

    Ich hätte den vk schon an einer anderen Stelle. Er würde mir schon durch den Hook übergeben.
    Aber wie komme ich an die verschiedenen Deadkeys ran, wie "AltGr". Und ich muss doch dann trotzdem irgendwie den gewünschten Char ermitteln, also doch wieder über "ToAsciiEx(..)".

    Mit meinem selbst verwalteten Status scheint es nun zu funktionieren.
    Mit "GetKeyboardState(State)" bekomme ich allerdings Dreckeffekte, wie in meinem anderen Thread beschrieben.
    Allerdings muss ich noch ausführlich testen.


Log in to reply