;~ AutoIt Version: 3.3.14.5
;~ Author: Tempo
#RequireAdmin
#include <GUIConstants.au3>
#include <WinAPISys.au3>
#include <Memory.au3>
Global $g_hGui_RawClick
Global $g_idDummy_RawClick
Global $g_hWnd_RawClick
example()
Func example()
Opt('TrayAutoPause', 0)
$g_hGui_RawClick = GUICreate(@ScriptName, 300, 200, -1, -1, -1, $WS_EX_TOPMOST)
$g_idDummy_RawClick = GUICtrlCreateDummy()
Local $idButton_Close = GUICtrlCreateButton('Закрыть', 50, 50, 200, 100)
Local $tRawInputDevice = DllStructCreate($tagRAWINPUTDEVICE)
With $tRawInputDevice
.UsagePage = 0x01 ; HID_USAGE_PAGE_GENERIC
.Usage = 0x02 ; HID_USAGE_GENERIC_MOUSE
.Flags = $RIDEV_INPUTSINK
.hTarget = $g_hGui_RawClick
EndWith
_WinAPI_RegisterRawInputDevices($tRawInputDevice)
GUIRegisterMsg($WM_INPUT, WM_INPUT)
GUISetState(@SW_SHOWMINIMIZED)
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idButton_Close
ExitLoop
Case $g_idDummy_RawClick
Switch _WinGetName($g_hWnd_RawClick)
Case 'btnNext'
MsgBox($MB_SYSTEMMODAL, Default, 'Click: btnNext')
;~ Case 'btnPrev'
EndSwitch
EndSwitch
WEnd
EndFunc ;==>example
Func WM_INPUT($hGui, $iMsg, $wParam, $lParam)
#forceref $iMsg, $wParam
Switch $hGui
Case $g_hGui_RawClick
Local $tRawInputMouse = DllStructCreate($tagRAWINPUTMOUSE)
If _WinAPI_GetRawInputData($lParam, $tRawInputMouse, DllStructGetSize($tRawInputMouse), $RID_INPUT) Then
If $tRawInputMouse.ButtonFlags = $RI_MOUSE_LEFT_BUTTON_UP Then
Local $tPoint = _WinAPI_GetMousePos()
$g_hWnd_RawClick = _WinAPI_WindowFromPoint($tPoint)
If $g_hWnd_RawClick Then GUICtrlSendToDummy($g_idDummy_RawClick)
EndIf
EndIf
;~ Case $g_hGui
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_INPUT
Func _WinGetName($hWnd)
;~ https://referencesource.microsoft.com/UIAutomationClientsideProviders/R/d909145577c98032.html
Local $tBuffer = DllStructCreate('wchar[2000]')
Local $iBufferSize = DllStructGetSize($tBuffer)
Local $tMemMap
Local $pMem = _MemInit($hWnd, $iBufferSize, $tMemMap)
_SendMessage($hWnd, _WinAPI_RegisterWindowMessage('WM_GETCONTROLNAME'), 2000, $pMem)
_MemRead($tMemMap, $pMem, $tBuffer, $iBufferSize)
_MemFree($tMemMap)
Return DllStructGetData($tBuffer, 1)
EndFunc ;==>_WinGetName