Beim Aufrufen des WINAPI-Befehls GetKeyboardState(aByteArray)
aus einer WPF-Anwendung (und vermutlich auch anderen Anwendungen) wird der Schlüssel SHIFT
nur dann korrekt erkannt, wenn die Anwendung den Fokus hat. Wenn die Anwendung keinen Fokus hat, ist aByteArray[VK_SHIFT]
0
nach dem Methodenaufruf.WINAPI GetKeyboardState Verhalten von GetKeyState geändert, wenn die Anwendung nicht im Fokus ist?
Wenn jedoch GetKeyState(aVKCode)
unmittelbar vor GetKeyboardState(aByteArray),
für jeden Wert von aVKCode
genannt, auch wenn der Rückgabewert verworfen wird, dann GetKeyboardState(aByteArray)
den korrekten Nicht-Null-Zustand der gehaltenen SHIFT
Schlüssel zur Verfügung stellen wird, wenn die Anwendung nicht im Fokus ist .
Dieses Verhalten ist kontraintuitive und scheint viele Programmierer Trauer verursacht haben. Ich glaube, dass es relevante Informationen in der Dokumentation zu GetKeyboardState
der wie folgt lautet:
Der Status ändert sich wie ein Faden Tastaturmeldungen aus seiner Nachrichtenwarteschlange entfernt. Der Status ändert sich nicht, wenn Tastaturnachrichten in die Nachrichtenwarteschlange des Threads gesendet werden, noch ändert er sich, wenn Tastaturnachrichten an Nachrichtenwarteschlangen anderer Threads gesendet oder aus diesen abgerufen werden.
Potentiell interagiert GetKeyState()
mit der Nachrichtenwarteschlange in der Weise, dass es vor dem GetKeyboardState()
um GetKeyboardState()
aufgerufen werden muß, wie gewünscht zu verhalten. Allerdings bin ich nicht vertraut mit dem Konzept der Nachrichtenwarteschlange und wie Elemente von Windows hinzugefügt und entfernt werden, und so dachte ich, ich würde hier fragen. Kann jemand erklären, warum ein Anruf zu GetKeyboardState()
allein den Schlüssel SHIFT
, der ohne Anwendungsfokus gehalten wird, nicht erfassen kann?
(Tastatur) Eingabe wird virtualisiert pro Thread (oder Gruppe von Eingängen an den Eingängen). Jeder Thread behält seine eigenen Tastaturstatusinformationen bei. Wenn Sie eine Taste drücken, während ein Fenster im Besitz eines Threads über den Eingabefokus verfügt, wird der Tastaturstatus in keinem anderen Thread aktualisiert (außer bei denen, die an diesen Thread angehängt sind). Weitere Details unter [Asynchrone Eingabe vs synchrone Eingabe, eine kurze Einführung] (https://blogs.msdn.microsoft.com/oldnewthing/20130604-00/?p=4173). – IInspectable