public KeyControlEventArgs( DeviceInfo dInfo, DeviceType device ) { m_deviceInfo = dInfo; m_device = device; }
/// <summary> /// Iterates through the list provided by GetRawInputDeviceList, /// counting keyboard devices and adding them to deviceList. /// </summary> /// <returns>The number of keyboard devices found.</returns> public int EnumerateDevices() { int NumberOfDevices = 0; uint deviceCount = 0; int dwSize = ( Marshal.SizeOf( typeof( RAWINPUTDEVICELIST ))); // Get the number of raw input devices in the list, // then allocate sufficient memory and get the entire list if( GetRawInputDeviceList( IntPtr.Zero, ref deviceCount, (uint)dwSize ) == 0 ) { IntPtr pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); // Iterate through the list, discarding undesired items // and retrieving further information on keyboard devices for (int i = 0; i < deviceCount; i++) { DeviceInfo dInfo; string deviceName; uint pcbSize = 0; RAWINPUTDEVICELIST rid = (RAWINPUTDEVICELIST)Marshal.PtrToStructure( new IntPtr((pRawInputDeviceList.ToInt32() + (dwSize * i))), typeof(RAWINPUTDEVICELIST)); GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize); if (pcbSize > 0) { IntPtr pData = Marshal.AllocHGlobal((int)pcbSize); GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, pData, ref pcbSize); deviceName = (string)Marshal.PtrToStringAnsi(pData); // Drop the "root" keyboard and mouse devices used for Terminal // Services and the Remote Desktop if (deviceName.ToUpper().Contains("ROOT")) { continue; } // If the device is identified in the list as a keyboard or // HID device, create a DeviceInfo object to store information // about it if (rid.dwType == RIM_TYPEKEYBOARD || rid.dwType == RIM_TYPEHID) { dInfo = new DeviceInfo(); dInfo.deviceName = (string)Marshal.PtrToStringAnsi(pData); dInfo.deviceHandle = rid.hDevice; dInfo.deviceType = GetDeviceType(rid.dwType); // Check the Registry to see whether this is actually a // keyboard, and to retrieve a more friendly description. bool IsKeyboardDevice = false; string DeviceDesc = ReadReg(deviceName, ref IsKeyboardDevice); dInfo.Name = DeviceDesc; // If it is a keyboard and it isn't already in the list, // add it to the deviceList hashtable and increase the // NumberOfDevices count if (!deviceList.Contains(rid.hDevice) && IsKeyboardDevice) { NumberOfDevices++; deviceList.Add(rid.hDevice, dInfo); } } Marshal.FreeHGlobal(pData); } } Marshal.FreeHGlobal(pRawInputDeviceList); return NumberOfDevices; } else { throw new ApplicationException( "An error occurred while retrieving the list of devices." ); } }
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);
public RawKeyEventArgs(DeviceInfo dInfo, Keys vKey, string keyName) { this.device = dInfo; this.vKey = vKey; this.keyName = keyName; }
/// <summary>Iterates through the list provided by GetRawInputDeviceList, /// adding eligible devices to deviceList. /// </summary> /// <param name="deviceFilter">device type filter - when present, only process messages from devices of this type</param> /// <returns>The number of keyboard devices found.</returns> private static void EnumerateDevices(DeviceType?deviceFilter, out Dictionary <IntPtr, DeviceInfo> deviceList) { deviceList = new Dictionary <IntPtr, DeviceInfo>(); uint deviceCount = 0; // Get the number of raw input devices in the list, // then allocate sufficient memory and get the entire list int dwSize = (Marshal.SizeOf(typeof(RAWINPUTDEVICELIST))); if (GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, (uint)dwSize) == 0) { IntPtr pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); // Iterate through the list, discarding undesired items // and retrieving further information on keyboard devices for (int i = 0; i < deviceCount; i++) { RAWINPUTDEVICELIST rid = (RAWINPUTDEVICELIST)Marshal.PtrToStructure( new IntPtr((pRawInputDeviceList.ToInt32() + (dwSize * i))), typeof(RAWINPUTDEVICELIST)); uint pcbSize = 0; GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize); if (pcbSize > 0) { IntPtr pData = Marshal.AllocHGlobal((int)pcbSize); GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, pData, ref pcbSize); string deviceDescriptor = (string)Marshal.PtrToStringAnsi(pData); // Drop the "root" keyboard and mouse devices used for Terminal // Services and the Remote Desktop if (deviceDescriptor.ToUpper().Contains("ROOT")) { continue; } // If the device is identified in the list as a keyboard or // HID device, create a DeviceInfo object to store information // about it if (rid.dwType == RIM_TYPEKEYBOARD || rid.dwType == RIM_TYPEHID) { DeviceInfo dInfo = new DeviceInfo(); dInfo.Handle = rid.hDevice; dInfo.Descriptor = deviceDescriptor; dInfo.DType = GetDeviceType(rid.dwType, deviceDescriptor); // Check the Registry to see whether this is actually a // keyboard, and to retrieve a more friendly description. string deviceDesc; string deviceClass; bool isKeyboardDevice; ReadReg(deviceDescriptor, out deviceDesc, out deviceClass, out isKeyboardDevice); dInfo.Name = deviceDesc; // If it is a keyboard and it isn't already in the list // and matches the device type filter, if provided, then // add it to the deviceList. if (isKeyboardDevice && !deviceList.ContainsKey(rid.hDevice)) { if (deviceFilter == null || deviceFilter.Value == dInfo.DType) { deviceList.Add(dInfo.Handle, dInfo); } } } Marshal.FreeHGlobal(pData); } } Marshal.FreeHGlobal(pRawInputDeviceList); } else { throw new ApplicationException("An error occurred while retrieving the list of devices."); } }