Copies the status of the 256 virtual keys to the specified buffer
#include <WinAPISys.au3>
_WinAPI_GetKeyboardState ( )
Success: | The structure of "byte[256]" that receives the status data for each virtual key. |
Failure: | Sets the @error flag to non-zero, call _WinAPI_GetLastError() to get extended error information. |
An application can call this function to retrieve the current status of all the virtual keys. The status changes
as a process removes keyboard messages from its message queue. The status does not change as keyboard messages are
posted to the process's message queue, nor does it change as keyboard messages are posted to or retrieved from
message queues of other processes.
When the function returns, each member of the array contains status data for a virtual key. If the high-order
bit is 1, the key is down; otherwise, it is up. If the key is a toggle key, for example CAPS LOCK, then the
low-order bit is 1 when the key is toggled and is 0 if the key is untoggled. The low-order bit is meaningless for
non-toggle keys. A toggle key is said to be toggled when it is turned on. A toggle key's indicator light (if any)
on the keyboard will be on when the key is toggled, and off when the key is untoggled.
To retrieve status information for an individual key, use the _WinAPI_GetKeyState() function. To retrieve the
current state for an individual key regardless of whether the corresponding keyboard message has been retrieved
from the message queue, use the _WinAPI_GetAsyncKeyState() function.
_WinAPI_GetAsyncKeyState, _WinAPI_GetKeyState
Search GetKeyboardState in MSDN Library.
#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>
#include <WindowsNotifsConstants.au3>
#cs
https://www.autoitscript.com/forum/topic/153782-help-filedocumentation-issues-discussion-only/?do=findComment&comment=1508831
#ce
Global $g_iVK1 = $VK_Q
Global $g_iVK2 = $VK_W
Global $g_iVK3 = $VK_E
Global $g_sBeep = "Beep"
Local $sHelp = "Hold a combination of Q+W+E" & @CRLF & _
"to activate different actions (Beeps on a diatonic scale, in this case)"
Local $sKL = _WinAPI_GetKeyboardLayoutLocale()
If $sKL = "French" Then
$g_iVK1 = $VK_A
$g_iVK2 = $VK_Z
$g_iVK3 = $VK_E
$sHelp = "Presser une combinaison de A+Z+E" & @CRLF & _
"pour activer differentes actions (Bips sur une échelle diatonique, dans ce cas)"
$g_sBeep = "Bip"
EndIf
Global $g_hWndKeybd = GUICreate('_WinAPI_GetKeyboardState v(' & @AutoItVersion & ')')
GUICtrlCreateLabel($sHelp, 40, 10)
Global $g_idEdit = GUICtrlCreateEdit("", 4, 48, 390, 345)
Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
DllStructSetData($tRID, 'UsagePage', 0x01) ; Generic Desktop Controls
DllStructSetData($tRID, 'Usage', 0x06) ; Keyboard
DllStructSetData($tRID, 'Flags', $RIDEV_INPUTSINK)
DllStructSetData($tRID, 'hTarget', $g_hWndKeybd)
_WinAPI_RegisterRawInputDevices($tRID)
GUIRegisterMsg($WM_INPUT, WM_INPUT)
GUISetState(@SW_SHOW)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
Switch $hWnd
Case $g_hWndKeybd
Local $tRIK = DllStructCreate($tagRAWINPUTKEYBOARD)
If _WinAPI_GetRawInputData($lParam, $tRIK, DllStructGetSize($tRIK), $RID_INPUT) Then KeystrokeLogic($tRIK)
EndSwitch
If $wParam Then Return 0 ; Jpm: not sure when it will occur
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_INPUT
Func KeystrokeLogic($tRIK)
Local Static $iIgnoreRelease = 0
If BitAND(1, DllStructGetData($tRIK, 'Flags')) Then ; on release
Local $tKeys = _WinAPI_GetKeyboardState()
Local $iChord = (BitAND(128, DllStructGetData($tKeys, 1, 1 + $g_iVK1)) ? 1 : 0) _
+ (BitAND(128, DllStructGetData($tKeys, 1, 1 + $g_iVK2)) ? 2 : 0) _
+ (BitAND(128, DllStructGetData($tKeys, 1, 1 + $g_iVK3)) ? 4 : 0) ; add one due to DllStructGetData being 1-based while the byte array is 0-based
Switch $iChord
Case 1
If Not $iIgnoreRelease Then
_Beep("Q", 384)
Else
$iIgnoreRelease -= 1
EndIf
Case 2
If Not $iIgnoreRelease Then
_Beep("W", 432)
Else
$iIgnoreRelease -= 1
EndIf
Case 3
If Not $iIgnoreRelease Then _Beep("Q+W", 480)
$iIgnoreRelease = 1
Case 4
If Not $iIgnoreRelease Then
_Beep("E", 512)
Else
$iIgnoreRelease -= 1
EndIf
Case 5
If Not $iIgnoreRelease Then _Beep("Q+E", 576)
$iIgnoreRelease = 1
Case 6
If Not $iIgnoreRelease Then _Beep("W+E", 640)
$iIgnoreRelease = 1
Case 7
_Beep("Q+W+E", 720)
$iIgnoreRelease = 2
EndSwitch
EndIf
EndFunc ;==>KeystrokeLogic
Func _Beep($sKeys, $iFrequency)
#forceref $sKeys ; Not use : english keyboard keys
GUICtrlSetData($g_idEdit, @TAB & $g_sBeep & " (" & $iFrequency & " Hz)" & @CRLF, 1)
Beep($iFrequency, 200)
EndFunc ;==>_Beep