;{ Start - Start the HID interface
RawHidStart()
{
global hHidModule
; Load the DLL
hHidModule := DllCall("LoadLibrary", "Str", "rawhid.dll", "Ptr") ; Avoids the need for DllCall() in the loop to load the library.
}
;}
;{ RawHidOpen - Open one or more HID interfaces
RawHidOpen(vPid := -1, vVid := 0xFEED, vUsagePage := 0xFF31, vUsage := 0x74)
{
global hHidModule, vNumberOfRawHids
vCount := 999
vNumberOfRawHids := DllCall("rawhid.dll\rawhid_open@20", "Int", vCount, "Int", vVid, "Int", vPid, "Int", vUsagePage, "Int", vUsage)
if ErrorLevel
{
MsgBox, Could not load rawhid.dll\rawhid_open@20 (Error = %ErrorLevel%)
vNumberOfRawHids := -1
}
return vNumberOfRawHids
}
;}
;{ RawHidGetPid - Get PID
RawHidGetPid(vHidIndex)
{
vPid := DllCall("rawhid\rawhid_get_pid@4", "Int", vHidIndex)
if ErrorLevel
{
MsgBox, Could not load rawhid.dll\rawhid_get_pid@4 (Error = %ErrorLevel%)
vPid := 0
}
return vPid
}
;}
;{ RawHidGetPid - Get PID
RawHidRead(vHidIndex, vTimeout)
{
; Buffersize must be greater than 32 or else the DLL call will fail. This is because the size of the RawHID packet
; (CONSOLE_EPSIZE) is 32.
vHidBufferSize := 32
VarSetCapacity(vHidBuffer, vHidBufferSize + 1, 0)
; rawhid_recv(int num, void *buf, int len, int timeout)
vCount := DllCall("rawhid\rawhid_recv@16", "Int", vHidIndex, "UPtr", &vHidBuffer, "Int", vHidBufferSize, "Int", vTimeout)
if ErrorLevel
{
MsgBox, Could not load rawhid.dll\rawhid_recv@16 (Error = %ErrorLevel%)
vHidBuffer := ""
}
if (vCount > 0)
{
VarSetCapacity(vHidBuffer, -1)
DbgMsg("Count = " . vCount . ", Buffer = <" . vHidBuffer . ">")
}
return vHidBuffer
}
;}
;{ RawHidGetIndexByPid - Get the HID Index based on the PID
RawHidGetIndexByPid(vPid)
{
global vNumberOfRawHids
Loop, %vNumberOfRawHids%
{
vHidIndex := A_Index - 1
vCurrentPid := RawHidGetPid(vHidIndex)
if (vCurrentPid == vPid)
{
return vHidIndex
}
}
return -1
}
;}
;{ RawHidClose - Close one or more HID Interfaces
RawHidClose(vHidIndex := -1)
{
global vNumberOfRawHids
if (vHidIndex < 0)
{
Loop, %vNumberOfRawHids%
{
DllCall("rawhid\rawhid_close@4", "Int", A_Index-1)
if ErrorLevel
{
MsgBox, Could not load rawhid.dll\rawhid_close@4 (Error = %ErrorLevel%)
}
}
}
else
{
DllCall("rawhid\rawhid_close@4", "Int", vHidIndex)
if ErrorLevel
{
MsgBox, Could not load rawhid.dll\rawhid_close@4 (Error = %ErrorLevel%)
}
}
}
;}
;{ RawHidStop - Stop the HID Interface
RawHidStop()
{
global hHidModule
RawHidClose()
DllCall("FreeLibrary", "Ptr", hHidModule) ; To conserve memory, the DLL may be unloaded after using it.
}
;}