Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Determining unique ID of input device


  • Please log in to reply
3 replies to this topic
beeski
  • Members
  • 158 posts
  • Last active: Mar 06 2016 08:21 PM
  • Joined: 22 Sep 2011

I heard from a quickey user (on MacOS) conditioning their scripts based on which of the two keyboards he had simultaneously connected a keypress came from. This was apparently done by first determining some unique ID of each of the keyboards.

 

Is there a way to do the same using ahk and Windows?

 

Thank you.



uname
  • Members
  • 194 posts
  • Last active: Oct 17 2015 08:46 AM
  • Joined: 13 Jun 2012
#NoEnv
SetBatchLines -1

OnMessage(0xFF, "InputHandler")
RegisterRawInputDevices(1, 6)
Esc::ExitApp

InputHandler(wParam, lParam) {
    static RID_INPUT        := 0x10000003
    static RIDI_DEVICENAME  := 0x20000007

    Critical

    DllCall("GetRawInputData"
        , "Ptr",    lParam
        , "UInt",   RID_INPUT
        , "Ptr",    0
        , "UIntP",  size
        , "UInt",   8 + A_PtrSize * 2)
    VarSetCapacity(buffer, size)
    DllCall("GetRawInputData"
        , "Ptr",    lParam
        , "UInt",   RID_INPUT
        , "Ptr",    &buffer
        , "UIntP",  size
        , "UInt",   8 + A_PtrSize * 2)

    devHandle := NumGet(buffer, 8)
    vk := NumGet(buffer, 8 + 2 * A_PtrSize + 6, "UShort")

    DllCall("GetRawInputDeviceInfo"
        , "Ptr",    devHandle
        , "UInt",   RIDI_DEVICENAME
        , "Ptr",    0
        , "UIntP",  size)
    VarSetCapacity(info, size)
    DllCall("GetRawInputDeviceInfo"
        , "Ptr",    devHandle
        , "UInt",   RIDI_DEVICENAME
        , "Ptr",    &info
        , "UIntP",  size)

    ToolTip % "tick:`t" A_TickCount
        . "`nname:`t"   StrGet(&info)
        . "`nvk:`t"     vk
}

RegisterRawInputDevices(usagePage, usage) {
    static RIDEV_INPUTSINK := 0x00000100
    VarSetCapacity(rawDevice, 8 + A_PtrSize)
    NumPut(usagePage,       rawDevice, 0, "UShort")
    NumPut(usage,           rawDevice, 2, "UShort")
    NumPut(RIDEV_INPUTSINK, rawDevice, 4, "UInt")
    NumPut(A_ScriptHWND,    rawDevice, 8, "UPtr")

    if !DllCall("RegisterRawInputDevices"
        , "Ptr",  &rawDevice
        , "UInt", 1
        , "UInt", 8 + A_PtrSize)
    {
        throw "Fail"
    }
}


beeski
  • Members
  • 158 posts
  • Last active: Mar 06 2016 08:21 PM
  • Joined: 22 Sep 2011
#NoEnv
SetBatchLines -1

OnMessage(0xFF, "InputHandler")
RegisterRawInputDevices(1, 6)
Esc::ExitApp

InputHandler(wParam, lParam) {
    static RID_INPUT        := 0x10000003
    static RIDI_DEVICENAME  := 0x20000007

    Critical

    DllCall("GetRawInputData"
        , "Ptr",    lParam
        , "UInt",   RID_INPUT
        , "Ptr",    0
        , "UIntP",  size
        , "UInt",   8 + A_PtrSize * 2)
    VarSetCapacity(buffer, size)
    DllCall("GetRawInputData"
        , "Ptr",    lParam
        , "UInt",   RID_INPUT
        , "Ptr",    &buffer
        , "UIntP",  size
        , "UInt",   8 + A_PtrSize * 2)

    devHandle := NumGet(buffer, 8)
    vk := NumGet(buffer, 8 + 2 * A_PtrSize + 6, "UShort")

    DllCall("GetRawInputDeviceInfo"
        , "Ptr",    devHandle
        , "UInt",   RIDI_DEVICENAME
        , "Ptr",    0
        , "UIntP",  size)
    VarSetCapacity(info, size)
    DllCall("GetRawInputDeviceInfo"
        , "Ptr",    devHandle
        , "UInt",   RIDI_DEVICENAME
        , "Ptr",    &info
        , "UIntP",  size)

    ToolTip % "tick:`t" A_TickCount
        . "`nname:`t"   StrGet(&info)
        . "`nvk:`t"     vk
}

RegisterRawInputDevices(usagePage, usage) {
    static RIDEV_INPUTSINK := 0x00000100
    VarSetCapacity(rawDevice, 8 + A_PtrSize)
    NumPut(usagePage,       rawDevice, 0, "UShort")
    NumPut(usage,           rawDevice, 2, "UShort")
    NumPut(RIDEV_INPUTSINK, rawDevice, 4, "UInt")
    NumPut(A_ScriptHWND,    rawDevice, 8, "UPtr")

    if !DllCall("RegisterRawInputDevices"
        , "Ptr",  &rawDevice
        , "UInt", 1
        , "UInt", 8 + A_PtrSize)
    {
        throw "Fail"
    }
}

 

Thank you, I'll try to make some sense of it in the coming hours. :)



wolfderby
  • Members
  • 20 posts
  • Last active: Jul 05 2014 08:34 PM
  • Joined: 27 Nov 2012

I'd like to use this to get the name of a keyboard/device, so I can build some logic like

 

if input from devicename = "usb scanner"

 

then run script...

 

Any advise on how to run this script to get the name of the device?