public static void DeviceAudit() { var keyboardNumber = 0; uint deviceCount = 0; var dwSize = (Marshal.SizeOf(typeof(Rawinputdevicelist))); if (GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, (uint)dwSize) == 0) { var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); for (var i = 0; i < deviceCount; i++) { uint pcbSize = 0; // On Window 8 64bit when compiling against .Net > 3.5 using .ToInt32 you will generate an arithmetic overflow. Leave as it is for 32bit/64bit applications var rid = (Rawinputdevicelist)Marshal.PtrToStructure(new IntPtr((pRawInputDeviceList.ToInt64() + (dwSize * i))), typeof(Rawinputdevicelist)); GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize); if (pcbSize <= 0) { return; } var size = (uint)Marshal.SizeOf(typeof(DeviceInfo)); var di = new DeviceInfo { Size = Marshal.SizeOf(typeof(DeviceInfo)) }; if (GetRawInputDeviceInfo(rid.hDevice, (uint)RawInputDeviceInfo.RIDI_DEVICEINFO, ref di, ref size) <= 0) { return; } var pData = Marshal.AllocHGlobal((int)pcbSize); GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, pData, ref pcbSize); var deviceName = Marshal.PtrToStringAnsi(pData); if (rid.dwType == DeviceType.RimTypekeyboard || rid.dwType == DeviceType.RimTypeHid) { var deviceDesc = GetDeviceDescription(deviceName); _ = new KeyPressEvent { DeviceName = Marshal.PtrToStringAnsi(pData), DeviceHandle = rid.hDevice, DeviceType = GetDeviceType(rid.dwType), Name = deviceDesc, Source = keyboardNumber++.ToString(CultureInfo.InvariantCulture) }; } Marshal.FreeHGlobal(pData); } Marshal.FreeHGlobal(pRawInputDeviceList); return; } throw new Win32Exception(Marshal.GetLastWin32Error()); }
public void EnumerateDevices() { lock (_padLock) { _deviceList.Clear(); var keyboardNumber = 0; var globalDevice = new KeyPressEvent { DeviceName = "Global Keyboard", DeviceHandle = IntPtr.Zero, DeviceType = Win32.GetDeviceType(DeviceType.RimTypekeyboard), Name = "Fake Keyboard. Some keys (ZOOM, MUTE, VOLUMEUP, VOLUMEDOWN) are sent to rawinput with a handle of zero.", Source = keyboardNumber++.ToString(CultureInfo.InvariantCulture) }; _deviceList.Add(globalDevice.DeviceHandle, globalDevice); var numberOfDevices = 0; uint deviceCount = 0; var dwSize = (Marshal.SizeOf(typeof(Rawinputdevicelist))); if (Win32.GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, (uint)dwSize) == 0) { var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); Win32.GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); for (var i = 0; i < deviceCount; i++) { uint pcbSize = 0; // On Window 8 64bit when compiling against .Net > 3.5 using .ToInt32 you will generate an arithmetic overflow. Leave as it is for 32bit/64bit applications var rid = (Rawinputdevicelist)Marshal.PtrToStructure(new IntPtr((pRawInputDeviceList.ToInt64() + (dwSize * i))), typeof(Rawinputdevicelist)); Win32.GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize); if (pcbSize <= 0) { continue; } var pData = Marshal.AllocHGlobal((int)pcbSize); Win32.GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, pData, ref pcbSize); var deviceName = Marshal.PtrToStringAnsi(pData); if (rid.dwType == DeviceType.RimTypekeyboard || rid.dwType == DeviceType.RimTypeHid) { var deviceDesc = Win32.GetDeviceDescription(deviceName); var dInfo = new KeyPressEvent { DeviceName = Marshal.PtrToStringAnsi(pData), DeviceHandle = rid.hDevice, DeviceType = Win32.GetDeviceType(rid.dwType), Name = deviceDesc, Source = keyboardNumber++.ToString(CultureInfo.InvariantCulture) }; if (!_deviceList.ContainsKey(rid.hDevice)) { numberOfDevices++; _deviceList.Add(rid.hDevice, dInfo); } } Marshal.FreeHGlobal(pData); } Marshal.FreeHGlobal(pRawInputDeviceList); NumberOfKeyboards = numberOfDevices; Debug.WriteLine("Found {0} Keyboard(s)", NumberOfKeyboards); return; } } throw new Win32Exception(Marshal.GetLastWin32Error()); }
public RawInputEventArg(KeyPressEvent arg) { KeyPressEvent = arg; }