Author: TheGood Last Modified: 20100614
AHKHID exposes the API calls necessary in order to interact with HID devices.
AHKHID_AddRegister(UsagePage = False, Usage = False, Handle = False, Flags = 0)
AHKHID_GetDevCount()
AHKHID_GetDevHandle(i)
AHKHID_GetDevIndex(Handle)
AHKHID_GetDevInfo(i, Flag, IsHandle = False)
AHKHID_GetDevName(i, IsHandle = False)
AHKHID_GetDevType(i, IsHandle = False)
AHKHID_GetInputData(InputHandle, ByRef uData)
AHKHID_GetInputInfo(InputHandle, Flag)
AHKHID_GetRegisteredDevs(ByRef uDev)
AHKHID_Initialize(bRefresh = False)
AHKHID_NumIsShort(ByRef Flag)
AHKHID_NumIsSigned(ByRef Flag)
AHKHID_Register()
AHKHID_UseConstants()
For the functions's parameters and return value, please see it's source code or the document.
It is not stdlib conform, because it uses global variables, labels and statements.
For update's details and remarks related to the functions, please see the AutoHotkey Forum: http://www.autohotkey.com/forum/viewtopic.php?t=41397
nonexistent
/*! TheGood AHKHID - An AHK implementation of the HID functions. AHKHID Example 1 Last updated: August 22nd, 2010 List all the HID devices connected to the computer. This example shows how to use all the AHKHID_GetDev functions (like AHKHID_GetDevInfo()). _________________________________________________ 1. Simply run the script. 2. Press Ctrl+c on a selected item to copy its name. */ ;Check if the OS is Windows Vista or higher bVista := (DllCall("GetVersion") & 0xFF >= 6) ;Create GUI Gui +Resize -MaximizeBox -MinimizeBox Gui, Add, Tab2, x6 y10 w460 h190 vMyTabs, Keyboards|Mice|Other Gui, Tab, 1 Gui, Add, ListView, x16 y40 w440 h150 vlvwKeyb gLV_Event AltSubmit, Name|Type|SubType|Keyboard Mode|Number of Function Keys|Number of Indicators|Number of Keys Total Gui, Tab, 2 Gui, Add, ListView, x16 y40 w440 h150 vlvwMouse gLV_Event AltSubmit, Name|Mouse ID|Number of Buttons|Sample Rate If bVista LV_InsertCol(5, "", "Has Horizontal Wheel") Gui, Tab, 3 Gui, Add, ListView, x16 y40 w440 h150 vlvwOther gLV_Event, Name|Vendor ID|Product ID|Version Number|Usage Page|Usage ;Set up the constants AHKHID_UseConstants() ;Get count iCount := AHKHID_GetDevCount() ;Retrieve info for each device Loop %iCount% { HID0 += 1 ;Get device handle, type and name HID%HID0%_Handle := AHKHID_GetDevHandle(HID0) HID%HID0%_Type := AHKHID_GetDevType(HID0) HID%HID0%_Name := AHKHID_GetDevName(HID0) ;Get device info If (HID%HID0%_Type = RIM_TYPEMOUSE) { HID%HID0%_ID := AHKHID_GetDevInfo(HID0, DI_MSE_ID) HID%HID0%_Buttons := AHKHID_GetDevInfo(HID0, DI_MSE_NUMBEROFBUTTONS) HID%HID0%_SampleRate := AHKHID_GetDevInfo(HID0, DI_MSE_SAMPLERATE) If bVista ;Only supported in Windows Vista and higher HID%HID0%_HWheel := AHKHID_GetDevInfo(HID0, DI_MSE_HASHORIZONTALWHEEL) } Else If (HID%HID0%_Type = RIM_TYPEKEYBOARD) { HID%HID0%_KBType := AHKHID_GetDevInfo(HID0, DI_KBD_TYPE) HID%HID0%_KBSubType := AHKHID_GetDevInfo(HID0, DI_KBD_SUBTYPE) HID%HID0%_KeyboardMode := AHKHID_GetDevInfo(HID0, DI_KBD_KEYBOARDMODE) HID%HID0%_FunctionKeys := AHKHID_GetDevInfo(HID0, DI_KBD_NUMBEROFFUNCTIONKEYS) HID%HID0%_Indicators := AHKHID_GetDevInfo(HID0, DI_KBD_NUMBEROFINDICATORS) HID%HID0%_KeysTotal := AHKHID_GetDevInfo(HID0, DI_KBD_NUMBEROFKEYSTOTAL) } Else If (HID%HID0%_Type = RIM_TYPEHID) { HID%HID0%_VendorID := AHKHID_GetDevInfo(HID0, DI_HID_VENDORID) HID%HID0%_ProductID := AHKHID_GetDevInfo(HID0, DI_HID_PRODUCTID) HID%HID0%_VersionNumber := AHKHID_GetDevInfo(HID0, DI_HID_VERSIONNUMBER) HID%HID0%_UsagePage := AHKHID_GetDevInfo(HID0, DI_HID_USAGEPAGE) HID%HID0%_Usage := AHKHID_GetDevInfo(HID0, DI_HID_USAGE) } } ;Add to listviews according to type Loop %HID0% { If (HID%A_Index%_Type = RIM_TYPEMOUSE) { Gui, ListView, lvwMouse If bVista ;Only supported in Windows Vista and higher LV_Add("",HID%A_Index%_Name, HID%A_Index%_ID, HID%A_Index%_Buttons, HID%A_Index%_SampleRate, HID%A_Index%_HWheel) Else LV_Add("",HID%A_Index%_Name, HID%A_Index%_ID, HID%A_Index%_Buttons, HID%A_Index%_SampleRate) } Else If (HID%A_Index%_Type = RIM_TYPEKEYBOARD) { Gui, ListView, lvwKeyb LV_Add("", HID%A_Index%_Name, HID%A_Index%_KBType, HID%A_Index%_KBSubType, HID%A_Index%_KeyboardMode , HID%A_Index%_FunctionKeys, HID%A_Index%_Indicators, HID%A_Index%_KeysTotal) } Else If (HID%A_Index%_Type = RIM_TYPEHID) { Gui, ListView, lvwOther LV_Add("", HID%A_Index%_Name, HID%A_Index%_VendorID, HID%A_Index%_ProductID, HID%A_Index%_VersionNumber , HID%A_Index%_UsagePage, HID%A_Index%_Usage) } } ;Adjust column width Gui, ListView, lvwMouse Loop 5 LV_ModifyCol(A_Index, "AutoHdr") Gui, ListView, lvwKeyb Loop 7 LV_ModifyCol(A_Index, "AutoHdr") Gui, ListView, lvwOther Loop 6 LV_ModifyCol(A_Index, "AutoHdr") Gui, Show Return GuiSize: Anchor("MyTabs", "wh") Anchor("lvwKeyb", "wh") Anchor("lvwMouse", "wh") Anchor("lvwOther", "wh") Return GuiEscape: GuiClose: ExitApp ;Catch Ctrl+c presses to copy selected device name to clipboard LV_Event: If (A_GuiEvent = "K") { If GetKeyState("c", "P") And GetKeyState("Ctrl", "P") { Gui, ListView, %A_GuiControl% LV_GetText(s, LV_GetNext()) ClipBoard := s } } Else If (A_GuiEvent = "DoubleClick") { Gui, ListView, %A_GuiControl% LV_GetText(s, LV_GetNext()) ClipBoard := s } Return ;Anchor by Titan, adapted by TheGood ;http://www.autohotkey.com/forum/viewtopic.php?p=377395#377395 Anchor(i, a = "", r = false) { static c, cs = 12, cx = 255, cl = 0, g, gs = 8, gl = 0, gpi, gw, gh, z = 0, k = 0xffff, ptr If z = 0 VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), ptr := A_PtrSize ? "Ptr" : "UInt", z := true If (!WinExist("ahk_id" . i)) { GuiControlGet, t, Hwnd, %i% If ErrorLevel = 0 i := t Else ControlGet, i, Hwnd, , %i% } VarSetCapacity(gi, 68, 0), DllCall("GetWindowInfo", "UInt", gp := DllCall("GetParent", "UInt", i), ptr, &gi) , giw := NumGet(gi, 28, "Int") - NumGet(gi, 20, "Int"), gih := NumGet(gi, 32, "Int") - NumGet(gi, 24, "Int") If (gp != gpi) { gpi := gp Loop, %gl% If (NumGet(g, cb := gs * (A_Index - 1)) == gp, "UInt") { gw := NumGet(g, cb + 4, "Short"), gh := NumGet(g, cb + 6, "Short"), gf := 1 Break } If (!gf) NumPut(gp, g, gl, "UInt"), NumPut(gw := giw, g, gl + 4, "Short"), NumPut(gh := gih, g, gl + 6, "Short"), gl += gs } ControlGetPos, dx, dy, dw, dh, , ahk_id %i% Loop, %cl% If (NumGet(c, cb := cs * (A_Index - 1), "UInt") == i) { If a = { cf = 1 Break } giw -= gw, gih -= gh, as := 1, dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short") , cw := dw, dw := NumGet(c, cb + 8, "Short"), ch := dh, dh := NumGet(c, cb + 10, "Short") Loop, Parse, a, xywh If A_Index > 1 av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField) , d%av% += (InStr("yh", av) ? gih : giw) * (A_LoopField + 0 ? A_LoopField : 1) DllCall("SetWindowPos", "UInt", i, "UInt", 0, "Int", dx, "Int", dy , "Int", InStr(a, "w") ? dw : cw, "Int", InStr(a, "h") ? dh : ch, "Int", 4) If r != 0 DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) ; RDW_UPDATENOW | RDW_INVALIDATE Return } If cf != 1 cb := cl, cl += cs bx := NumGet(gi, 48, "UInt"), by := NumGet(gi, 16, "Int") - NumGet(gi, 8, "Int") - gih - NumGet(gi, 52, "UInt") If cf = 1 dw -= giw - gw, dh -= gih - gh NumPut(i, c, cb, "UInt"), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short") , NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short") Return, true }