Tastatureingabe überprüfen



  • Hi Leute
    ich bin neu in der Programmierung mit der Winapi und allen anderen Sachen von Win sonst entwickelt ich auf Linux.

    Meine frage ist wie kann ich überprüfen ob eine Taste noch gedrückt ist oder nicht. Ich benutze

    GetAsyncKeyState(VK_SPACE)
    

    für eine Abfrage der Taste.
    Nun jetzt möchte ich das er das Wort so lange ausgibt wenn ich die Taste gedrückt halte was hier nicht der fall ist:

    #include <windows.h>
    //...
            while(true)
            {
                if(GetAsyncKeyState(VK_SPACE))
                {
                    cout << "Hallo" << endl;
                    Sleep(500);
                }
            }
    

    Die Funktion hört nur dann auf wenn ich die Taste wieder drücke.
    Weiß jemand wie ich das überprüfen kann ob gedrückt oder nicht?



  • Eigentlich genau so. Oder möchtest du, dass der String nur angezeigt wird, wenn die Taste gedrückt ist?

    while(true)
    {
    	if(GetAsyncKeyState(VK_SPACE) & 0x80000000)
    		cout << "\rHallo";
    	else if(GetAsyncKeyState(VK_LCONTROL) & 0x80000000)
    		cout << "\rWelt";
    	else cout << "\r          "; // überschreiben
    }
    


  • Wenn die Taste gedrückt ist soll der string angezeigt werden.



  • Wenn der Text nicht ständig überschrieben werden soll, würde ich über einen bool-Wert gehen

    bool showstr = false;
    while(true)
    {
    	if((GetAsyncKeyState(VK_SPACE) & 0x80000000))
    	{
    		if(!showstr)
    		{
    			cout << "\rHallo";
    			showstr = true;
    		}
    	}
    	else if(showstr)
    	{
    		cout << "\r          ";
    		showstr = false;
    	}
    }
    

    Es erfolgt also nur die Ausgabe, beim erstmaligen Abfangen. Wenn die Taste nicht gedrückt ist, wird auch nur einmal überschrieben.



  • mh ist nicht das was ich suche.
    Ich möchte das so machen das er das Wort "druck" solange untereinander ausgibt wie ich die Leertaste gedrückt halte.



  • so ich habs jetzt so wolte ich das haben:

    while(true)
        {
            if(WM_KEYDOWN)
            {
                if(GetAsyncKeyState(VK_SPACE))
                {
                    cout << "druck" << endl;
                    Sleep(500);
                }
            }
        }
    

    aber trotzdem danke für die hilfe jetzt weiß ich wie ich das so in einer reihe ausgeben kann 😃



  • if(WM_KEYDOWN) kannst du auch einfacher schreiben : if(1). Die Bedingung ist immer erfüllt.
    Was unterscheidet dein letztes Beispiel von deinem ersten? Gar nichts. Deshalb dachte ich, die Strings sollen nicht untereinander ausgegeben, sondern immer wieder überschrieben werden.
    WM_KEYDOWN ist erst interessant, wenn du ein eigenes Fenster erstellst:

    LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {  switch(msg)
       {  case WM_KEYDOWN:
            // wparam und lparam auswerten
            break;
       }
    

Log in to reply