I am working on some functionality to detect whether a standard keyboard was used for input in my UI or if a barcode scanner (that acts like a keyboard) was used. Instead of dealing with a scanner SDK, I decided I would read from the raw input to get device info and make a determination.
I discovered while testing with multiple UIs is that when the WM_INPUT message is received and the function called, the $hWnd param is always the same (apparently whatever handle I set the "hTarget" to in the RAWINPUTDEVICE struct).
Is this normal behavior??
Using the test code below, no matter what window you give input to the $hWnd param never changes.
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
$Form1 = GUICreate("Form 1", 300, 300, -1, 10)
ConsoleWrite("$Form1 = " & $Form1 & @CRLF)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 300, 300)
GUISetState(@SW_SHOW, $Form1)
$Form2 = GUICreate("Form 2", 300, 300, -1, 350)
ConsoleWrite("$Form2 = " & $Form2 & @CRLF)
$Edit2 = GUICtrlCreateEdit("", 0, 0, 300, 300)
GUISetState(@SW_SHOW, $Form2)
GUIRegisterMsg($WM_INPUT, "WM_INPUT") ; https://msdn.microsoft.com/en-us/library/ms645590(v=vs.85).aspx
$tRID = DllStructCreate($tagRAWINPUTDEVICE) ; https://msdn.microsoft.com/en-us/library/ms645565(v=vs.85).aspx
DllStructSetData($tRID, "UsagePage", 1)
DllStructSetData($tRID, "Usage", 6)
DllStructSetData($tRID, "Flags", 0)
DllStructSetData($tRID, "hTarget", $Form1) ; According to the struct def, if hTarget=NULL then it should follow keyboard focus. - nope :(
$pRID = DllStructGetPtr($tRID)
_WinAPI_RegisterRawInputDevices($pRID) ; https://msdn.microsoft.com/en-us/library/ms645600(v=vs.85).aspx
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam)
ConsoleWrite("hWnd = " & $hWnd & " | Title = " & WinGetTitle($hWnd) & @CRLF)
ConsoleWrite("Active Window = " & WinGetTitle("[ACTIVE]") & @CRLF)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_INPUT