R
Bei mir funktioniert es bislang, habe aber auch keine Erwartungen mehr, die dann nicht erfüllt werden. Hier mal nach meinem Kenntnisstand:
Statusänderung einer Taste tritt für GetAsyncKeyState() erst ein, wenn eine gesendete (korrespondierende?) Tastaturbotschaft aus der Nachrichtenschleife des aufrufenden Thread entfernt wird.
GetAsyncKeyState() und Aufruf einer Tastenstatus-Printfunktion habe ich in KeyProc() innerhalb der Abfrage "if ((code == HC_ACTION) && (wParam == WM_...))". GetAsyncKeyState() liefert 0x8001, wenn in der Abfrage (wParam == WM_KEYUP) eingesetzt wird. Bei (wParam == WM_KEYDOWN) wird auch 0x8001 geliefert, solange dieselbe Taste gedrückt gehalten wird. Sonst wird 0x0000 beim Niederdrücken einer Taste zurückgegeben oder auch dann, wenn die betätigte Taste nicht dem Argument in GetAsyncKeyState() entspricht.
Auffällig ist (bei mir im Test), daß GetAsyncKeyState(), sofern es nicht 0x0000 zurückgibt, immer 0x8001 liefert, aber nie 0x8000 oder 0x0001. Eine betätigte Taste gilt hier immer gleichzeitig als gedrückt und getoggelt, aber nie nur das Eine oder nur das Andere.
Übrigends ist auf MSDN auch folgendes zu lesen:
- Benutzer sollten sich nicht auf Rückgaben von GetAsyncKeyState() verlassen.
- Eine Nachricht für einen Hook wird bei Ablauf eines Zeitlimit stillschweigend aus der Nachrichtenschleife gelöscht, wenn also z.B. eine Prozedur zuviel Zeit vertrödelt.
Das kann wohl bedeuten, daß GetAsyncKeyState() nur in unkritischen Fällen und nur zur groben Detektierung von Tastenbetätigungen verwendet werden soll und daß
Tastaturnachrichten (und die Statusänderungen?) verloren gehen können.
LG