Wie GetAsyncKeyState verwenden, um zu sehen, Taste gedrückt wurde, wird für x Sekunden
Ich versuche, erstellen einen code, der erkennt, wenn der Maus-Knopf wurde gedrückt. Bisher habe ich einen code, der erkennt, wenn die Taste wurde einmal gedrückt. Aber es ist nicht lassen Sie mich überprüfen, wenn man den Knopf ständig gedrückt. Für e.g die linke Maus-Taste gedrückt, dann startet ein timer, nach 0,5 Sekunden wird es noch einmal zu überprüfen und wenn es immer noch down ist-Ausgabe etwas.
Ich will es einrichten wie diese
while (true)
{
if (GetAsyncKeyState(VK_LBUTTON) & (0x8000 != 0))
{
cout << ("left button pressed") << endl;
Sleep(500);
if (GetAsyncKeyState(VK_LBUTTON) & (0x8000 != 0))
{
cout << ("Left button held down") << endl;
}
}
}
Jedoch funktioniert es nicht, es gibt nur die zweite Aussage, wenn ich Doppelklick schnell hintereinander.
Bestimmt, ob eine Taste nach oben oder unten zu der Zeit die Funktion aufgerufen wird, und ob die Taste gedrückt wurde, nachdem ein vorheriger Aufruf von GetAsyncKeyState.
Den msdn-website sagt, dass. Bedeutet das, dass ich überprüfen soll, ob es ist, nach der Zeit, um das Ergebnis zu erhalten was ich will.
- 0x8000 ist immer ungleich 0 ist, legen Sie die Klammern richtig. Der einfachste Weg, dies zu testen ist mit
if (GetAsyncKeyState(VK_LBUTTON) < 0)
. Jetzt wissen Sie, warum GetAsyncKeyState() hat die sehr ungewöhnliche KURZE Rückkehr geben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
GetAsyncKeyState
zeigt nur, dass der Staat jetzt, es sollte nicht verwendet werden, zur überwachung möglicher Veränderungen über die Zeit!Wenn Sie verfolgen möchten, die Maus, egal, welche Anwendung empfängt den Eingabe-dann sollten Sie
SetWindowsHookEx
zu installieren low-level mouse hook.Wenn Sie nur über Maus-Ereignisse in Ihrem eigenen Fenster öffnen, dann wäre es besser zu verfolgen WM_LBUTTON* Maus-Nachrichten wie bereits in der anderen Antwort.
In Reaktion auf WM_LBUTTONDOWN legen Sie ein globales flag auf true, und starten Sie den timer. In Reaktion auf WM_LBUTTONUP Sie auf false gesetzt und der timer angehalten. Wenn der timer feuert und das flag true ist, führen Sie dann die gewünschte Aufgabe.
Wenn Sie versuchen, zu implementieren dies in der WINAPI-GUI-Anwendung, hier ist Ihr Antwort - schreiben Sie die erste timestamp auf WM_LBUTTONDOWN, schreiben die zweite auf WM_LBUTTONUP und berechnen die verstrichene Zeit, die Sie brauchen. Was ist eigentlich besser - es werden nur Nachrichten abfangen, die kommen in IHRE Anwendung Fenster, und nicht zu fangen, die in anderen apps " - Taste drückt, wie man mit GetAsyncKeyState.
UPDATE: wie auch immer, erste Benutzer-generierte Daten(wie Mausklicks, Tastendrücke, etc.) zu arbeiten ist viel besser mit der standard-windows-message-handling(wie es ist Ereignis-basiert, mehr auf die natürlichen Programmierer) anstelle der überprüfung des Zustands eines Objekts einmal pro einen Zeitraum von Zeit, können Sie möglicherweise übersehen das gewünschte Ereignis insgesamt. Es sieht aus wie Sie versuchen zu lösen das XY problem.
UPDATE2: Hier ist ein nettes tutorial, wie zu tun, es richtig zu stellen.
WM_LBUTTONDOWN
undWM_LBUTTONUP
ermöglicht es Ihnen nicht zu reagieren in der Zeit der timeout-Zeit. Würden Sie implementieren müssen, um eine timer, finden Sie heraus, wenn eine Taste gedrückt wurde, für einen vorgegebenen Intervall. Neben der Frage aufgefordert werden, für die physischen Schlüssel Zustand. Was für ein per-thread virtualisiert Eingabe nicht dieser Anforderung gerecht zu werden.