Abfragen, ob Taste aktiv.



  • MSDN schrieb:

    BOOL GetKeyboardState (PBYTE lpKeyState);

    lpKeyState
    [in] Pointer to the 256-byte array that receives the status data for each virtual key.

    Heißt in Code umgesetzt:

    char keystate [256];
    GetKeyboardState(keystate);
    
    if(keystate[VK_ESCAPE])
        cout << "Escape gedrückt" << endl;
    

    MfG SideWinder



  • @Jochen: hrhr, so hätte ich es auch formulieren können 😃

    MfG SideWinder



  • Jochen Kalmbach schrieb:

    Vermutlich kannst Du nicht die Doku lesen 😉
    [url]http://msdn.microsoft.com/library/en-us/ (...)[/url]

    Hab das mit dem Pointer nicht so ganz verstanden.
    Denn wo soll ich denn da einen Zeiger erhalten?
    BOOL GetKeyboardState(

    PBYTE lpKeyState
    );

    der Eingabewert ist von Typ PBYTE und der Rückgabewert ist BOOL... seh aber nichts von einem Zeiger.

    und...

    char keystate [256];
    GetKeyboardState(keystate);
    
    if(keystate[VK_ESCAPE])
        cout << "Escape gedrückt" << endl;
    

    ...schneint nicht zu funktionieren, und zwar sagt er:
    error C2664: 'GetKeyboardState': Konvertierung des Parameters 1 von 'char [256]' in 'PBYTE' nicht möglich



  • Mach einfach aus dem "char" ein "BYTE", dann passt es...



  • ich weiß... langsam geh ich richtig auf die Nerven...
    aber es geht immer noch nicht ...

    Der regiert einfach nicht auf den Tastendruck.

    Und wenn ich dann die Variable keystate[VK_ESCAPE] ausgeben lass, gibs nur ein Leerzeichen (oder soetwas).



  • Die einfachste Lösung ist:

    #include <stdio.h>
    #include <windows.h>
    #include <tchar.h>
    
    int _tmain()
    {
      BYTE keystate [256]; 
      do
      {
        USHORT us = (USHORT)GetKeyState(VK_ESCAPE);
        if ( (us & 0x8000) == 0x8000)
          break;
        Sleep(1);
      } while(TRUE);
    }
    


  • danke.

    aber ich hätte noch 2 Fragen:

    Was bedeutet (us & 0x8000) == 0x8000)?
    0x8000 ist immer 0x8000 also warum muss man das extra nochmal prüfen und für was steht 0x8000?

    Und wie schaff ich es, dass er auf Buchstaben reagiert?



  • Ich mag halt explizite Überprüfungen... du kannst das " == 0x8000" aber auch weglassen...
    Auf den Wert 0x8000 kommt man wenn man die Doku liest... 😉

    Wie buchstaben... Du meinst wohl

    USHORT us = (USHORT)GetKeyState('A');
    


  • Jochen Kalmbach schrieb:

    Ich mag halt explizite Überprüfungen... du kannst das " == 0x8000" aber auch weglassen...

    Hab übersehen, dass es das "Bitweise-Und" ist 🙄
    Und kann man nicht weglassen..

    Jochen Kalmbach schrieb:

    Wie buchstaben... Du meinst wohl

    USHORT us = (USHORT)GetKeyState('A');
    

    Geht leider nicht... und die Hexadezimal anzugeben funktioniert irgendwie auch nicht... sonst noch eine Idee?

    Aber noch eine andere Frage:
    Irgendwie scheint es, dass danch noch ein Zeichen im Keyboarpuffer ist, denn ein getch wird übergangen. Woran könnte das liegen? Wird das Zeichen nicht durch die Abfrage abgearbeitet?



  • Bei mir geht das wunderbar...



  • Irgendwelche Zeichen im Keyboard-Buffer werden natürlich nicht abgearbeitet (oder rausgeholt)... dazu verwendest Du bitte ReadFile oder ReadConsole(Input) (oder alles abgeleitete wie cin, scanf getch usw.)



  • Jochen Kalmbach schrieb:

    Bei mir geht das wunderbar...

    OK dachte, dass er zwischen Groß-/Kleinbuchstaben unterscheidet...
    Aber so is es eh besser.

    Dann nochmal danke



  • Schau doch einfach mal in die "winuser.h" und such mal nach "VK_A", dann wirst Du sehen warum ich 'A' verwendet habe... 😉


Anmelden zum Antworten