UDF > WinAPIEx > System > User Keyboard Input >


_WinAPI_GetAsyncKeyState

Détermine si une touche est enfoncée ou relachée au moment où la fonction est appelée

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

Paramètre

$iKey Touche à tester

Valeur de retour

Succès: Si le bit le plus significatif est positionné, la touche est relachée, et si le bit le moins significatif est positionné, la touche est enfoncée après l'appel précédent à _WinAPI_GetAsyncKeyState(). Cependant, vous ne devez pas compter sur ce dernier comportement; pour plus d'informations, voir Remarques.
Échec: La valeur retournée est 0 si la touche n'est pas pressée, ou dans les cas suivants:
Le bureau actuel n'est pas le bureau actif.
Le thread de premier plan appartient à un autre processus et le bureau ne permet pas l'enregistrement du hook ou du journal.

Remarques

Les constantes à utiliser pour $iKey sont dans WinAPIvkeysConstants.au3

La fonction GetAsyncKeyState fonctionne avec les boutons de la souris. Cependant, elle vérifie l'état des boutons physiques de la souris, pas les boutons logiques de la souris auxquels les boutons physiques sont mappés. Par exemple, l'appel à _WinAPI_GetAsyncKeyState($VK_LBUTTON) retourne toujours l'état du bouton physique gauche de la souris, qu'il soit mappé sur le bouton gauche ou droit de la souris logique. Vous pouvez déterminer le mappage actuel du système des boutons physiques de souris sur les boutons logiques de la souris en appelant _WinAPI_GetSystemMetrics($SM_SWAPBUTTON), qui retourne TRUE si les boutons de la souris ont été échangés.

Bien que le bit le moins significatif de la valeur de retour indique si la touche a été pressée depuis la dernière requête, en raison de la nature multitâche pré-emptive de Windows, une autre application peut appeler GetAsyncKeyState et recevoir le bit "récemment pressé" au lieu de votre application. Le comportement du bit le moins significatif de la valeur de retour est conservé strictement pour la compatibilité avec les applications Windows 16 bits (qui ne sont pas pré-emptives) et sur lesquelles il ne faut pas se fier.

Vous pouvez utiliser les constantes des codes des clés virtuelles $VK_SHIFT, $VK_CONTROL et $VK_MENU comme valeurs pour le paramètre vKey. Elles donnent l'état des touches SHIFT, CTRL ou ALT sans distinguer entre gauche et droite.

Voir aussi

Consultez GetAsyncKeyState dans la librairie MSDN.

Exemple

#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