Gedrückte Maustaste oder Keyboadtaste erkennen?



  • Hallo, habe mal eine Frage.
    Wie kann ich mittels c++ erkennen ob eine bestimmte Maus oder Keyboardtaste gedrück gehalten wird ? nicht nur ob sie einmal gedrück wird sondern ob sie immer noch gedrückt wird.

    Bräuchte eine Lösung die unabhängig vom gerade aktiven Fenster aus funktioniert.



  • tomcat09 schrieb:

    mittels c++

    Geht nicht über Standard C++, da musst du schon sagen, welches BS du verwendest (das Toolkit geht auch).



  • benutze Windows ab XP



  • Suche mal nach Keyboard-Hook und Mouse-Hook dann wirst du fündig.



  • Dafür hatte man in DOS-Zeiten spezielle kleine ASM-Funktionen eingesetzt. Für Konsolenanwendungen weiss ich das heute nicht mehr. Für WinApi-Anwendungen gibt es da zahlreiche Möglichkeiten. Mein Vorschlag: entweder in der CALLBACK-Funktion des Fensters abfangen oder falls nicht möglich, subclasses mit eigener CALLBACK-Funktion einrichten. Das letztere geht immer und erspart Hooks.

    Für weiteres teile mit, ob das Ziel eine KonsolenAnwendung oder eine WindowsAnwendung sein soll.



  • hallo, erstmal danke für die Antworten 🙂
    Also es soll für Vollbild also Windowsanwendungen sein.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo sollte auch bei Windows Anwendungen funktionieren

    #include <windows>
    #include <stdio>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    short key;
    char szKey[MAX_PATH]; 
    int scan;
    
    while(1)
    {
      Sleep(10);
      for(key=0;key<256;key++)
     {
    
        if(GetAsyncKeyState(key)==-32767) 
    
        {
           scan=MapVirtualKeyEx(key,0,GetKeyboardLayout(0));
           GetKeyNameText(scan << 16,szKey,MAX_PATH);
           cout<<szkey<<endl;  // Anstatt cout kannste hier ja eine MessageBox 
         // verwenden z.b.
    
        }
      }
    }
    }
    


  • Ich habs mal kurz getestet so geht es.

    Jedoch kann man so nicht erkennen ob ein kleiner oder ob ein großer Buchstabe eingeben wurde aber ka ob du das brauchst.

    #include <windows.h>
    
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    short key;
    char szKey[MAX_PATH]; 
    int scan;
    
    while(1)
    {
      Sleep(10);
      for(key=0;key<256;key++)
     {
    
        if(GetAsyncKeyState(key)==-32767) 
    
        { 
           scan=MapVirtualKeyEx(key,0,GetKeyboardLayout(0));
           GetKeyNameText(scan << 16,szKey,MAX_PATH);
    
           MessageBox ( 0 , szKey , "Tasten Eingabe Überprüfen"ftq , 0 );
    
        }
      }
    }
    
    }
    


  • huhu vielen dank erstmal für die antwort 😃
    das mit dem erkennen welche Taste gedrückt wurde geht. Allerdings bräuchte ich es vorallem um zu erkennen wann die rechte oder linke Maustaste gedrückt wurde kann mir da vielleicht jemand weiterhelfen :)?



  • Geht auch mit GetAsyncKeyState.

    if(GetAsyncKeyState(VK_LBUTTON)){/*Linke Maustaste*/}
    if(GetAsyncKeyState(VK_RBUTTON)){/*Rechte Maustaste*/}
    if(GetAsyncKeyState(VK_MBUTTON)){/*Mittlere Maustaste*/}
    

    MfG, Jochen



  • tnx 😃



  • Ich sehe hier im Forum in letzter Zeit öfters dass der Returnwert von GetAsyncKeyState "direkt" verwendet wird. Das ist falsch. Lest bitte die Doku zu GetAsyncKeyState, da steht beschrieben was der Returnwert bedeutet.
    Dokumentiert sind die Bedeutung des LSB und das MSB, d.h. man sollte diese auch ausmaskieren, und nicht einfach den ganzen Returnwert auswerten.



  • Hmm, Ja, werde ich mir mal ansehen, ich hab bis jetzt noch keine Probleme damit bekommen, den return-Wert direkt zu verwenden.



  • Naja es kommt darauf an was du willst.
    Mal vorausgesetzt dass nicht in späteren Windows-Versionen weitere Bits definiert werden.

    Wenn du z.B. alle 10 Sekunden einfach nur if (GetAsyncKeyState(VK_FOO)) machst, und der User alle 2-3 Sekunden *kurz* eine Taste antippt, dann wirst du *immer* "true" bekommen, da GetAsyncKeyState() dir mit dem LSB angibt ob die Taste seit dem letzten Aufruf von GetAsyncKeyState() mal gedrückt worden ist.
    Du gehst also in das "if" rein obwohl die Taste zu dem Zeitpunkt gar nicht gedrückt war.

    Das allerdings nur, so lange nicht andere Programmteile die gleichzeitig laufen auch GetAsyncKeyState() verwenden, denn die könnten dir dann das LSB "wegfressen" und du siehst es nimmer.

    -> GetAsyncKeyState(VK_FOO) ohne explizit MSB Prüfen ist für popo 😃

    (Zu Debuggingzwecken verwende ich es selbst öfters. Manchmal maskieren ich sogar explizit das "problematisch" LSB, weil ich eben nur wissen will ob die Taste zwischendurch gedrückt wurde, aber eben wie gesagt nur zum Debuggen)


Anmelden zum Antworten