public static void DeviceAudit() { var file = new FileStream("DeviceAudit.txt", FileMode.Create, FileAccess.Write); var sw = new StreamWriter(file); 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) { sw.WriteLine("pcbSize: " + pcbSize); sw.WriteLine(Marshal.GetLastWin32Error()); 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) { sw.WriteLine(Marshal.GetLastWin32Error()); 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); var dInfo = new KeyPressEvent { DeviceName = Marshal.PtrToStringAnsi(pData), DeviceHandle = rid.hDevice, DeviceType = GetDeviceType(rid.dwType), Name = deviceDesc, Source = keyboardNumber++.ToString(CultureInfo.InvariantCulture) }; sw.WriteLine(dInfo.ToString()); sw.WriteLine(di.ToString()); sw.WriteLine(di.KeyboardInfo.ToString()); sw.WriteLine(di.HIDInfo.ToString()); //sw.WriteLine(di.MouseInfo.ToString()); sw.WriteLine("========================================================================================================="); } Marshal.FreeHGlobal(pData); } Marshal.FreeHGlobal(pRawInputDeviceList); sw.Flush(); sw.Close(); file.Close(); return; } throw new Win32Exception(Marshal.GetLastWin32Error()); }
private static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data, ref uint dataSize);