public static RAWINPUTDEVICELIST[] GetInputDeviceList()
        {
            uint deviceCount = 0;
            int  size        = Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));

            if (GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, size) != 0)
            {
                throw new Win32Exception("Failed to get raw input devices");
            }

            RAWINPUTDEVICELIST[] rawInputDevices = new RAWINPUTDEVICELIST[deviceCount + 1]; // TODO: This is right? deviceCount + 1?
            if (deviceCount > 0)
            {
                IntPtr data = Marshal.AllocHGlobal((int)(size * deviceCount));
                try
                {
                    GetRawInputDeviceList(data, ref deviceCount, size);
                    for (int i = 0; i < deviceCount; i++)
                    {
                        RAWINPUTDEVICELIST rid = (RAWINPUTDEVICELIST)Marshal.PtrToStructure(
                            new IntPtr((data.ToInt32() + (size * i))), typeof(RAWINPUTDEVICELIST));
                        rawInputDevices[i] = rid;
                    }
                }
                finally
                {
                    Marshal.FreeHGlobal(data);
                }
            }
            return(rawInputDevices);
        }
        public static RAWINPUTDEVICELIST[] GetInputDeviceList()
        {
            uint deviceCount = 0;
            int size = Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));

            if (GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, size) != 0)
                throw new Win32Exception("Failed to get raw input devices");

            RAWINPUTDEVICELIST[] rawInputDevices = new RAWINPUTDEVICELIST[deviceCount + 1]; // TODO: This is right? deviceCount + 1?
            if (deviceCount > 0)
            {
                IntPtr data = Marshal.AllocHGlobal((int)(size * deviceCount));
                try
                {
                    GetRawInputDeviceList(data, ref deviceCount, size);
                    for (int i = 0; i < deviceCount; i++)
                    {
                        RAWINPUTDEVICELIST rid = (RAWINPUTDEVICELIST)Marshal.PtrToStructure(
                            new IntPtr((data.ToInt32() + (size * i))), typeof(RAWINPUTDEVICELIST));
                        rawInputDevices[i] = rid;
                    }
                }
                finally
                {
                    Marshal.FreeHGlobal(data);
                }
            }
            return rawInputDevices;
        }