GetRawInputDeviceList (user32)
Last changed: gmartinnc-

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 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:


Alternative Managed API:



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)
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));

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