C++ Auf loslassen der Taste reagieren

FSA

Erfahrenes Mitglied
Hallo
Eine Frage: GetAsyncKeyState möchte ich, dass es erst true liefert wenn ich die Taste losgelassen habe.
Mit Folgendem Code: if( GetAsyncKeyState(VK_CONTROL) &0x1000) habe ich das problem ( in der Reder schliefe) Das wenn ich die taste gedrückt halte es immer wieder ausgeführt wird( die if verzweigung)
Wie löse ich das?
Windows, C++ ;)
Danke
 
Hallo,

Bin mir nicht ganz sicher, aber ich würde es mit einer While-Schlaufe versuchen:

if(Gedrückt)
{
while(Gedrückt){}
// Weiterfahren, Taste losgelassen
}

De Handler
 
Hi

@deHandler: Das ist ja eben das Problem.
Ich vermute mal, die "Reder schliefe" soll noch was machen.
Deine Lösung blockiert alles.

Und noch ein Hinweis auf die Codetags: [code=cpp]...[/code].

@Msvc++:
a) Mach zusätzlich eine Variable, die den letzten bekannten Tastenstatus speichert.
Wenn GetAsyncKeyState "nicht gedrückt" liefert und die Variable aber auf "gedrückt"
steht, ist die Taste gerade losgelassen worden.

b) kA., unter welchen Bedingungen du entwickelst,
aber was wäre mit WM_KEYUP?

Gruß
 
Hallo,

Im folgenden Code wird der Programmablauf nicht mehr gesperrt. Die Funktion kann aber nur für eine Taste verwendet werden. (Da nur eine Variable)

Den Code hab ich getestet. sollte also funktionieren.

C++:
#include <windows.h>
#include <stdio.h>

bool bKPress = false;     // Globale Variable, zum Speichern ob beim letzten Durchgang gedrückt wurde

bool KeyUp( int vKey)
{
     if( GetAsyncKeyState( vKey ) )
     {
            bKPress = true;
     }
     else
     {
           if( bKPress )
           {
                 bKPress = false;
                 return true;
           }
     }

     return false;
}

int main()
{
	while(!KeyUp ( VK_CONTROL )) {}   // Ja hier wird blockiert, irgendwas muss das 
									  // Beispiel auch machen
	
	printf("CTRL losgelassen");

	system("pause");
}

@sheel, hab nur php-Tags gefunden.
 
Hier ist noch ein Beispiel für mehrere Tasten.
In der While - schleife können dann noch sonstige gewünschte Prozesse ausgeführt werden, ohne, dass das Programm blockiert.
Im enum sind auch noch mal die States von GetAsyncKeyState() definiert.
Doku: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx
C:
#include <windows.h>
enum
{
    MAX_KEY = 128,
    TOGGLE = -32767,
    NOT_PRESSED = 0
};

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hprev, LPSTR CmdLn, int CmdShow)
{
	short state = 0;
    int proceed = 1;
	
	short key = 0;
    short keypressed[MAX_KEY]; // initialize it with 0 values
	
    while (proceed) //as long as proceed != 0 watch the state of Keys
    {
		for (key = 1; key < MAX_KEY; key++) // instead of for loob one specified key can be monitored
		{
			state = GetAsyncKeyState(key);
			if (state <= TOGGLE)
			{
				if (keypressed[key] == 0)
				{
					//proceed given Key from for loop when first time pressed
					keypressed[key] = 1;	
				}
			}
			else if (state >= NOT_PRESSED)
			{
				if (keypressed[key] !=  0)
				{
					//proceed Key after state TOGGLE has been released
					keypressed[key] = 0;
				}	
			}		
		}
		Sleep(5);
	}
}
 
Zurück