GetKeyState ?



  • Hy,

    kann mir mal jemand ganz genau erklären, was GetAsyncKeyState und GetKeyState macht?? Ich hab' schon überall geguckt (Google,MSDN,usw.), aber nirgends hab ichs richtig verstanden. 😕

    Danke schon mal.



  • GetAsyncKeyState:
    Ermittelt den Zustand (Gedrück, losgelassen, aktiviert/deaktiviert) einer Taste auf der Tastatur zum Zeitpunkt des Funktionsaufrufs.

    GetKeyState:
    Ermittelt den Zustand einer Taste auf der Tastatur zum Zeitpunkt des Nachrichteneingang an den entsprechenden Thread, an den die Input-Nachricht gerichtet war.

    Referenz:
    GetAsyncKeyState
    GetKeyState



  • Und wie frage ich ab, ob eine bestimmte Taste gedrückt wurde?



  • Indem du ihren Keycode als Parameter an Get(Async)KeyState übergibst - z.B. if(GetKeyState(VK_RETURN) cout<<"Enter gedrückt"; .


  • Mod

    Aber grundsätzlich benötigt man diese Funktionen selten, und wenn überhaupt GetKeyState.

    Jedes Fenster das den Fokus hat bekommt ja die entsprechenden WM_KEY... Nachrichten!



  • Wenn Du prüfen willst, ob eine Taste sich im gedrückten oder nicht gedrückten Zustand zum Zeitpunkt t befindet, bieten sich diese Makros an:

    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEY_UP  (vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    

    So kannst Du das benutzen

    if(KEY_DOWN(VK_SPACE))
    {
      DoSomething();
    }
    


  • Was hat die 0x8000 zu bedeuten?

    Ach ja: Der Tastendruck soll systemweit abgefangen werden!



  • Win32 Programmers's Reference schrieb:

    SHORT GetAsyncKeyState(int vKey**);**

    Return Values

    If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. The return value is zero if a window in another thread or process currently has the keyboard focus.

    Man kann statt 0x8000 auch 0x80 verwenden, da für den oberen Wert die Bits 0xFF80 gleichzeitig verwendet werden.


  • Mod

    Am einfachsten ist einfach auf <0 zu prüfen!



  • tsp schrieb:

    Ach ja: Der Tastendruck soll systemweit abgefangen werden!

    ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-39383.html



  • naja bleibt wohl noch das problem mit wurde die taste losgelassen 😉

    ich hab das was geschrieben gehabt:

    bool keys[256];
    bool lkeys[256];
    
    //.... abfragen (zB per thread)
    while(running!=true) //solange bis running == false irgendwo gesetzt wird ;)
    {
    memcpy(&lkeys,&keys,sizeof(keys));
    for(int i=0 ;i<257; i++)
        {
        if(GetAsyncKeyState(i)==0)
        {
            keys[i]=FALSE;
        }
        else
        {
            keys[i]=TRUE;
        }
    }
    
    Sleep(10); // damit der thread nicht das system überbelasstet
    }
    //fürs abfragen pb zuletzt eine taste "gedrück" wurde :
    
    if(keys[65]==TRUE && lkeys[65]==FALSE)
    {
        ;//A wurde gedrückt ...
    }
    

    ist vllt nicht die schnellste methode aber bestimmt die zeitnahste, Fehler gibt es nur wenn der zweite thread seltener abfragt als der als dieser die daten veröffentlicht 😉 , da nach 20ms nicht mehr den status hat sie wurde gedrückt sonder sie ist seit unbekannt gedrückt, sollte das der fall sein den wert erhöhen ... notfalls 100 ms da wird jeder tasteb druck erkannt!

    eine andere möglichkeit wäre gleich in diesem thread eine art puffer zu machen der die vorgänge abspeichert (kostet mehr resourcen)



  • keksekekse schrieb:

    the most significant bit is set

    Was isn das? 😕



  • Hey, hallo is da noch jemand? 😕 😕

    Ich hätte gerne gewusst was the most significant bit is set ist. Kann mir das jemand sagen??



  • Wenn DU ein BYTE hast (also 8 Bit), dann ist das MSB das 8. Bit also der Wert 0x80.


Anmelden zum Antworten