static public void Start(int vid) { int lastDeviceCnt = 0; HidDevicesList = new List <HidDevice>(); if (!IsConnected) { var _hidTask = Task.Factory.StartNew(() => { //while (hidDevice == null) while (true) { HidDevicesList = HidDevices.Enumerate(vid).ToList(); if (HidDevicesList.Count != lastDeviceCnt) { Console.WriteLine("Device list updated"); DeviceListUpdated?.Invoke(); } lastDeviceCnt = HidDevicesList.Count; Thread.Sleep(50); } }); } }
public void EnumerateDevices() { lock (lockObj) { DevicesByHandle.Clear(); DevicesByID.Clear(); Device globalDevice = new Device("Global Keyboard", Win32.GetDeviceType(DeviceType.Keyboard), "Fake Keyboard, some keys are sent to RawInput with a handle of zero."); DevicesByHandle.Add(globalDevice.Handle, globalDevice); DevicesByID.Add(globalDevice.ID, globalDevice); uint deviceCount = 0; uint dwSize = (uint)(Marshal.SizeOf(typeof(RawInputDeviceList))); if (Win32.GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, dwSize) == 0) { IntPtr pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); Win32.GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, dwSize); for (var i = 0; i < deviceCount; i++) { RawInputDeviceList rid = (RawInputDeviceList)Marshal.PtrToStructure(new IntPtr((pRawInputDeviceList.ToInt64() + (dwSize * i))), typeof(RawInputDeviceList)); uint pcbSize = 0; Win32.GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, IntPtr.Zero, ref pcbSize); if (pcbSize <= 0) { continue; } IntPtr pData = Marshal.AllocHGlobal((int)pcbSize); Win32.GetRawInputDeviceInfo(rid.hDevice, RawInputDeviceInfo.RIDI_DEVICENAME, pData, ref pcbSize); string deviceID = Marshal.PtrToStringAnsi(pData); if (rid.dwType == (uint)DeviceType.Keyboard || rid.dwType == (uint)DeviceType.HID) { string deviceName = Win32.GetDeviceDescription(deviceID); Device device = new Device(deviceID, Win32.GetDeviceType(rid.dwType), rid.hDevice, deviceName); if (!DevicesByHandle.ContainsKey(rid.hDevice)) { DevicesByHandle.Add(rid.hDevice, device); } if (!DevicesByID.ContainsKey(device.ID)) { DevicesByID.Add(device.ID, device); } } Marshal.FreeHGlobal(pData); } Marshal.FreeHGlobal(pRawInputDeviceList); Console.WriteLine($"Found {DevicesByHandle.Count - 1} device(s)"); DeviceListUpdated?.Invoke(this, Devices); return; } } throw new Win32Exception(Marshal.GetLastWin32Error()); }
public void ProcDeviceListUpdated() { DeviceListUpdated?.InvokeOnMainThread(this); }