示例#1
0
        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);
                    }
                });
            }
        }
示例#2
0
        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);
 }