Шурик Владимирский
Новичок
- Сообщения
- 2
- Репутация
- 0
Здравствуйте уважаемые специалисты в области autoit.
Нашел на просторах интернета скрипт, который определяет - с какой клавиатуры была нажата клавиша (если подключенных клавиатур больше одной).
Для нажатия с любой клавиши PS2-клавиатуры консоль выдает:
0 х 00010049
Different Device Pressed
Для нажатия с любой клавиши USB-клавиатуры консоль выдает:
0 х280112C7
Device Pressed
Но этот код не определяет, какая именно клавиша нажата.
Как настроить этот скрипт autoit для определения разных клавиш «Q» ?
Если я нажму Q - на клавиатуре PS2, тогда Msgbox (или консоль) отобразит сообщение «Key Q, PS2 Keyboard».
Если я нажму Q - на клавиатуре USB, тогда Msgbox отобразит сообщение «Key Q, USB Keyboard»,
Нашел на просторах интернета скрипт, который определяет - с какой клавиатуры была нажата клавиша (если подключенных клавиатур больше одной).
Код:
;Bilgus 2018
;Determine which keyboard was pressed
#include <Array.au3>
#include <WinAPISys.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global Const $HWND_MESSAGE = (-3) ;create a message-only window when set as Parent
;RAWINPUTDEVICE Constants
Global Const $HID_USAGE_PAGE_GENERIC = 0x1
Global Const $HID_USAGE_GENERIC_KEYBOARD = 0x6
Global $ghSelectedDevice
Global $gaKeyboards = EnumRawKeyboards("\HID")
If IsArray($gaKeyboards) And $gaKeyboards[0][0] >= 1 Then $ghSelectedDevice = $gaKeyboards[1][0] ; hard coded change to suit
_ArrayDisplay($gaKeyboards, '_WinAPI_EnumRawInputDevices', "", 0, Default, "Handle|Type|VID|Keys") ;Not Needed...
Global $hTarget = GUICreate("main", 10, 10, Default, Default, Default, Default, $HWND_MESSAGE) ;Dummy window to recieve messages
Register_RawInput($HID_USAGE_PAGE_GENERIC, $HID_USAGE_GENERIC_KEYBOARD, $RIDEV_INPUTSINK, $hTarget) ;$RIDEV_INPUTSINK recieves input when not foreground
; Register WM_INPUT message
GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
HotKeySet("{ESC}", _Exit)
While 1
Sleep(1000)
WEnd
Func Device_Pressed()
ConsoleWrite("Device Pressed" & @CRLF)
EndFunc ;==>Device_Pressed
Func _Exit()
Exit
EndFunc ;==>_Exit
Func Register_RawInput($iUsagePage, $iUsage, $iFlags, $hTargetHwnd)
Local $tRID = DllStructCreate($tagRAWINPUTDEVICE)
DllStructSetData($tRID, 'UsagePage', $iUsagePage)
DllStructSetData($tRID, 'Usage', $iUsage)
DllStructSetData($tRID, 'Flags', $iFlags)
DllStructSetData($tRID, 'hTarget', $hTargetHwnd)
; Register HID input to obtain info from devices
_WinAPI_RegisterRawInputDevices($tRID)
EndFunc ;==>Register_RawInput
Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam) ;Callback from RawInput
#forceref $iMsg, $wParam
;'struct;dword Type;dword Size;handle hDevice;wparam wParam;endstruct'
Local $tRIH = DllStructCreate($tagRAWINPUTHEADER)
If _WinAPI_GetRawInputData($lParam, $tRIH, DllStructGetSize($tRIH), $RID_HEADER) And DllStructGetData($tRIH, "Type") = $RIM_TYPEKEYBOARD Then
ConsoleWrite("0x" & Hex(DllStructGetData($tRIH, "hDevice")) & @CRLF)
If $ghSelectedDevice = DllStructGetData($tRIH, "hDevice") Then
Device_Pressed()
Else
;Different Device
ConsoleWrite("Different Device Pressed" & @CRLF)
EndIf
EndIf
Return $GUI_RUNDEFMSG ;Pass on to default winproc
EndFunc ;==>WM_INPUT
Func EnumRawKeyboards($sDeviceNameMatch = "")
;Returns array of keyboard device IDs
Local $tInfo, $aData = _WinAPI_EnumRawInputDevices()
If IsArray($aData) Then
Local $aKeyboards[$aData[0][0] + 1][4]
;'dword Size;dword Type;';'struct;dword KbType;dword KbSubType;dword KeyboardMode;dword NumberOfFunctionKeys;dword NumberOfIndicators;dword NumberOfKeysTotal;endstruc'
Local $_tagRID_INFO_KEYBOARD = $tagRID_INFO_KEYBOARD
If StringRight($_tagRID_INFO_KEYBOARD, 1) <> "t" Then $_tagRID_INFO_KEYBOARD &= "t" ; t is missing from endstruct
Local $iCt = 0, $iSz
Local $tInfo, $tDeviceName, $sDeviceName
For $i = 1 To $aData[0][0]
$tInfo = DllStructCreate($_tagRID_INFO_KEYBOARD)
If _WinAPI_GetRawInputDeviceInfo($aData[$i][0], $tInfo, DllStructGetSize($tInfo), $RIDI_DEVICEINFO) And $aData[$i][1] = $RIM_TYPEKEYBOARD Then
$iSz = _WinAPI_GetRawInputDeviceInfo($aData[$i][0], 0, 0, $RIDI_DEVICENAME) ;Get bytes needed
$tDeviceName = DllStructCreate('wchar[' & $iSz + 1 & ']') ;Holds device name string
If _WinAPI_GetRawInputDeviceInfo($aData[$i][0], $tDeviceName, DllStructGetSize($tDeviceName), $RIDI_DEVICENAME) Then
$sDeviceName = DllStructGetData($tDeviceName, 1)
If $sDeviceNameMatch <> "" And Not StringInStr($sDeviceName, $sDeviceNameMatch) Then ContinueLoop
$iCt += 1
$aKeyboards[$iCt][0] = $aData[$i][0] ;Handle
$aKeyboards[$iCt][1] = $aData[$i][1] ;Type
$aKeyboards[$iCt][2] = $sDeviceName
$aKeyboards[$iCt][3] = DllStructGetData($tInfo, "NumberOfKeysTotal")
EndIf
EndIf
Next
$aKeyboards[0][0] = $iCt ; Write count of keyboard devices to array
ReDim $aKeyboards[$iCt + 1][4] ;Resize array
EndIf
Return $aKeyboards
EndFunc ;==>EnumRawKeyboards
Для нажатия с любой клавиши PS2-клавиатуры консоль выдает:
0 х 00010049
Different Device Pressed
Для нажатия с любой клавиши USB-клавиатуры консоль выдает:
0 х280112C7
Device Pressed
Но этот код не определяет, какая именно клавиша нажата.
Как настроить этот скрипт autoit для определения разных клавиш «Q» ?
Если я нажму Q - на клавиатуре PS2, тогда Msgbox (или консоль) отобразит сообщение «Key Q, PS2 Keyboard».
Если я нажму Q - на клавиатуре USB, тогда Msgbox отобразит сообщение «Key Q, USB Keyboard»,