/*! 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 }