KeyHook - Frage zur Auswertung der Tastencodes



  • Hallo, nun habe ich mich mal wieder ein bischen mit den KeyHooks hier beschäftigt, ich versuche sie ja in einem Programm einzubauen. Das funktioniert alles soweit ganz gut, nur kann man irgendwie bestimmen, welcher Code ESCAPE ist und welcher die Eingabetaste, etc.? - Auf den Text kann man sich nicht wirklich verlassen, da dieser Systemabhängig ist... Gibt es irgendwelche Konstanten, mit denen man sie vergleichen kann? - Sind sie überhaupt überall gleich?

    MfG Windoof





  • Genau das ist es ja ebend nicht 😉 - das habe ich auch schon versucht, aber die Codes sind anders... irgendwie... zumindest klappt es z.B. nicht auf VK_ESCAPE zu überprüfen, jedenfalls wird z.B. die Funktion Tu_was() nicht ausgeführt, wenn ESC gedrückt wird, und der Code sieht etwa so aus:

    if(Code==VK_ESCAPE) { Tu_was(); }
    

    Aber zu den Virtual KeyCodes habe ich auch noch 'ne Frage: Wie kann man diese in Char umwandeln, sodass auch das korrekte Zeichen angezeigt wird - A-Z und 0-9 laufen soweit ganz prima, aber bei Punkt (.) kommt das 1/4-Zeichen, etc...

    Danke für die Hilfe.



  • Weiß darauf wirklich niemand eine Antwort?



  • Hallo

    vergiß nicht, das alle (einfachen) Zeichen und damit Tastenbefehle einem ASCII-Zeichen entsprechen. Wenn du das ausführst

    Caption = IntToStr(VK_RETURN);
    

    wirst du feststellen, das Enter dem ASCII-Wert 13 entspricht. Deshalb kannst du statt VK_RETURN auch 13 schreiben, das dann plattformübergreifend gilt. Die Nummern der andern KeyCodes kannst du genauso rausfinden.

    /Edit :
    Und die Rückumwandlung ist auch kein Problem

    int Number = '.';
      Caption = char(Number);
    

    bis bald
    akari



  • Welcher Datentyp hat "Code"? Werden da evtl. weitere Infos reincodiert? Wo wird "Code" gesetzt? Was ist der Inhalt von "Code" beim entsprechenden Vergleich? Schon den Debugger befragt?



  • akari schrieb:

    Deshalb kannst du statt VK_RETURN auch 13 schreiben, das dann plattformübergreifend gilt.

    Wo genau soll da dann der Unterschied liegen? VK_RETURN ist ein normales Makro, wo nichts weiter passiert, als das die entsprechenden Zeichen eingesetzt werden.
    Also würde ich im Sinne der Lesbarkeit auf 13 verzichten und VK_RETURN einsetzen, da kein merklicher Gewinn aus der unlesbarmachung des Vergleichs entsteht.



  • Hallo

    diese Anmerkung war auf diese Frage gemünzt

    Gibt es irgendwelche Konstanten, mit denen man sie vergleichen kann? - Sind sie überhaupt überall gleich?

    Natürlich sollte man unter Windows immer die Keycodes nehmen.

    bis bald
    akari



  • Vermute dein Problem liegt eher in der Auswertung des Übergabeparamters:

    LRESULT CALLBACK DLL_EXP Tastaturhook(int nCode,WORD wp,DWORD lp)

    hier wird der Key in wp geliefert und sollte mit

    if((wp==VK_ESCAPE||wp==VK_RETURN)&&(lp&0x80000000))

    auswertbar sein. Obiges Beispiel akzeptiert ESC und Return



  • Ohne das jetzt zu testen... ja, das scheint mein Problem zu sein ^^ - was bedeutet dieses 0x80000000?



  • Windoof schrieb:

    Ohne das jetzt zu testen... ja, das scheint mein Problem zu sein ^^ - was bedeutet dieses 0x80000000?

    Auszug aus der Hilfe von GetAsyncKeyState:

    ... If the most significant bit is set, the key is down ...

    alles klar? hier wird nix anderes gemacht, als das höchstwertige bit zu testen (alle anderen bit werden durch die und-verknüpfung auf 0 gesetzt und nur die bits bleiben im 1. term gesetzt die im 2. term eine gesetzte 1 haben).



  • schau mal in der hilfe nach virtual keycodes oder soo
    oder schau im internet nach ascii-tabellen
    ansonsten geht ja immer noch:
    if (Key=='a')
    {
    ....
    }
    bye mollitz



  • mollitz:
    Thema verfehlt, Setzen, Sechs!

    😉

    Lies dir den Thread einfach nochmal komplett durch und vergiss nicht den Code, auf den sich die ursprüngliche Frage bezog.


Anmelden zum Antworten