GetRawInputDeviceList (user32)
Last changed: gmartinnc-38.104.62.78

.
Summary
The GetRawInputDeviceList function enumerates the raw input devices attached to the system.

C# Signature:

    public enum RawInputDeviceType : uint
    {
        MOUSE = 0,
        KEYBOARD = 1,
        HID = 2
    }

    [StructLayout( LayoutKind.Sequential )]
    public struct RAWINPUTDEVICELIST
    {
        public IntPtr hDevice;
        public RawInputDeviceType Type;
    }

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern uint GetRawInputDeviceList
    (
        [In, Out] RawInputDeviceList[] RawInputDeviceList,
        ref uint NumDevices,
        uint Size /* = (uint)Marshal.SizeOf(typeof(RawInputDeviceList)) */
    );

VB.Net Signature:

   < StructLayout( LayoutKind.Sequential )> _
    Public Structure RAWINPUTDEVICELIST
       Public hDevice as Int32
       Public dwType as UInt32
    End Structure

   <DllImport("user32.dll", CharSet:=CharSet.Auto,
    EntryPOint:="GetRawInputDeviceList", SetLastError:=True)> _
    Public Function GetRawInputDeviceList(ByVal pRawInputDeviceList As
    IntPtr, ByRef puiNumDevices As Int32, ByVal cbSize As Int32) As Int32
    End Function

VB Signature:

Declare Function GetRawInputDeviceList Lib "user32.dll" (ByVal pRawInputDeviceList As
    IntPtr, ByRef puiNumDevices As Long, ByVal cbSize As Long) As Long

User-Defined Types:

None.

Alternative Managed API:

Notes:

None.

Tips & Tricks:

Sample Code:

int structSize = Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));    
int bufferCount = 10;
IntPtr buffer = Marshal.AllocHGlobal(bufferCount * structSize);

int deviceCount = GetRawInputDeviceList(buffer, ref bufferCount, structSize);

for (int i = 0; i < deviceCount; ++i)
{
    RAWINPUTDEVICELIST device = (RAWINPUTDEVICELIST)Marshal.PtrToStructure(
new IntPtr((buffer.ToInt32() + (structSize * i))),typeof(RAWINPUTDEVICELIST));
...
}

    // A convenient function for getting all raw input devices.
    // This method will get all devices, including virtual devices
    // For remote desktop and any other device driver that's registered
    // as such a device.
    public static RAWINPUTDEVICELIST[] GetAllRawDevices()
    {
       uint deviceCount = 0;
        uint dwSize = (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));

        // First call the system routine with a null pointer
        // for the array to get the size needed for the list
        uint retValue = Win32API.GetRawInputDeviceList(null, ref deviceCount, dwSize);

        // If anything but zero is returned, the call failed, so return a null list
        if (0 != retValue)
        return null;

        // Now allocate an array of the specified number of entries
        RAWINPUTDEVICELIST[] deviceList = new RAWINPUTDEVICELIST[deviceCount];

        // Now make the call again, using the array
        retValue = Win32API.GetRawInputDeviceList(deviceList, ref deviceCount, dwSize);

        // Free up the memory we first got the information into as
        // it is no longer needed, since the structures have been
        // copied to the deviceList array.
        IntPtr pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount));
        Marshal.FreeHGlobal(pRawInputDeviceList);

        // Finally, return the filled in list
        return deviceList;
    }

Documentation