Ermittelt ob eine Tastaturtaste zur Zeit des Funktionsaufrufs gedrückt ist oder nicht
#include <WinAPISys.au3>
_WinAPI_GetAsyncKeyState ( $iKey )
$iKey | Taste die geprüft werden soll |
Erfolg: | Wenn die Funktion erfolgreich ist, gibt der Rückgabewert (SHORT) an, ob die Taste seit dem letzten Aufruf von _WinAPI_GetAsyncKeyState() gedrückt wurde und ob die Taste derzeit auf oder ab ist. Wenn das höchstwertige Bit gesetzt ist (KeyState < 0), ist die Taste gedrückt, und wenn das niedrigstwertige Bit gesetzt ist (Mod(KeyState, 2) = 1), wurde die Taste nach dem vorherigen Aufruf von _WinAPI_GetAsyncKeyState() gedrückt. Man sollte sich jedoch nicht auf dieses letzte Verhalten verlassen. Weitere Informationen findet man in den Bemerkungen. |
Fehler: | Der Rückgabewert ist 0 wenn die Taste nicht gedrückt ist oder in den folgenden Fällen: Der aktuelle Desktop ist nicht der aktive Desktop Der Vordergrund-Thread gehört zu einem anderen Prozess und der Desktop erlaubt den Hook oder die Journal-Aufnahme nicht. |
Die für $iKey zu verwendeten Konstanten findet man in WinAPIvkeysConstants.au3
Die GetAsyncKeyState-Funktion funktioniert mit Maustasten. Es wird jedoch der Status der physischen Maustasten überprüft, nicht die logischen Maustasten, denen die physischen Tasten zugeordnet sind. Beispielsweise gibt der Aufruf _WinAPI_GetAsyncKeyState ($VK_LBUTTON) immer den Status der linken physischen Maustaste zurück, unabhängig davon, ob sie der linken oder rechten logischen Maustaste zugeordnet ist. Man kann die aktuelle Zuordnung der physischen Maustasten zu logischen Maustasten durch das System ermitteln, indem man _WinAPI_GetSystemMetrics ($SM_SWAPBUTTON) aufruft, das TRUE zurückgibt, wenn die Maustasten ausgetauscht wurden.
Obwohl das niedrigstwertige Bit des Rückgabewerts angibt, ob die Taste seit der letzten Abfrage gedrückt wurde, kann eine andere Anwendung aufgrund des vorbeugenden Multitasking-Charakters von Windows GetAsyncKeyState aufrufen und anstelle Ihrer Anwendung das Bit "Zuletzt gedrückt" empfangen. Das Verhalten des niedrigstwertigen Bits des Rückgabewerts wird aus Gründen der Kompatibilität mit 16-Bit-Windows-Anwendungen (die nicht präemptiv sind) streng beibehalten und sollte nicht verwendet werden.
Man kann die Codekonstanten für virtuelle Schlüssel $VK_SHIFT, $VK_CONTROL und $VK_MENU als Werte für den Parameter vKey verwenden. Dies gibt den Status der UMSCHALT-, STRG- oder ALT-Tasten an, ohne zwischen links und rechts zu unterscheiden.
_WinAPI_GetKeyState, _WinAPI_GetKeyboardState
Suche nach GetAsyncKeyState in der MSDN Bibliothek.
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>
Example()
Func Example()
Local $hGUI = GUICreate("_WinAPI_GetAsyncKeyState Demo", 500, 300)
GUICtrlCreateLabel("Press the number to select the task you wish to use from list below", 10, 30)
GUICtrlCreateLabel("Press 1 key for task 1" & @CRLF & @CRLF & _
"Press 2 key for task 2" & @CRLF & @CRLF & _
"Press 3 key for task 3" & @CRLF & @CRLF & _
"Press the ESCAPE key, or click the close button, to exit", 10, 60)
GUISetState(@SW_SHOW)
Local Const $iBitMask = 0x8000 ; a bit mask to strip the high word bits from the return of the function.
While GUIGetMsg() <> $GUI_EVENT_CLOSE
If BitAND(_WinAPI_GetAsyncKeyState($VK_1), $iBitMask) <> 0 Or BitAND(_WinAPI_GetAsyncKeyState($VK_NUMPAD1), $iBitMask) <> 0 Then
MsgBox($MB_SYSTEMMODAL, "_WinAPI_GetAsyncKeyState", "Task 1")
ElseIf BitAND(_WinAPI_GetAsyncKeyState($VK_2), $iBitMask) <> 0 Or BitAND(_WinAPI_GetAsyncKeyState($VK_NUMPAD2), $iBitMask) <> 0 Then
MsgBox($MB_SYSTEMMODAL, "_WinAPI_GetAsyncKeyState", "Task 2")
ElseIf BitAND(_WinAPI_GetAsyncKeyState($VK_3), $iBitMask) <> 0 Or BitAND(_WinAPI_GetAsyncKeyState($VK_NUMPAD3), $iBitMask) <> 0 Then
MsgBox($MB_SYSTEMMODAL, "_WinAPI_GetAsyncKeyState", "Task 3")
ElseIf BitAND(_WinAPI_GetAsyncKeyState($VK_ESCAPE), $iBitMask) <> 0 Then
MsgBox($MB_SYSTEMMODAL, "_WinAPI_GetAsyncKeyState", "The Esc Key was pressed, exiting.")
ExitLoop
EndIf
WEnd
GUIDelete($hGUI)
EndFunc ;==>Example