Funktionreferenz


_WinAPI_GetAsyncKeyState

Beschreibung anzeigen in

Ermittelt ob eine Tastaturtaste zur Zeit des Funktionsaufrufs gedrückt ist oder nicht

#include <WinAPISys.au3>
_WinAPI_GetAsyncKeyState ( $iKey )

Parameter

$iKey Taste die geprüft werden soll

Rückgabewert

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.

Bemerkungen

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.

Verwandte Funktionen

_WinAPI_GetKeyState, _WinAPI_GetKeyboardState

Siehe auch

Suche nach GetAsyncKeyState in der MSDN Bibliothek.

Beispiel

#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