示例#1
0
 private static string GetUserDataFile(KeyboardDevice device)
 {
     return(Path.Combine(UserDataPath, device.State.ModelId + ".txt"));
 }
示例#2
0
        public static void RefreshConnectedDevices()
        {
            lock (connectedDevices)
            {
                foreach (HidDevice device in DeviceList.Local.GetHidDevices())
                {
                    if (connectedDevices.ContainsKey(device.DevicePath) || ignoredDevices.Contains(device.DevicePath))
                    {
                        continue;
                    }

                    // I *think* 65 is used by all GK6X keyboards
                    const int reportLength = 65;
                    ushort[]  productIds;
                    bool      validDevice = false;
                    try
                    {
                        if (device.GetMaxInputReportLength() == reportLength &&
                            device.GetMaxOutputReportLength() == reportLength &&
                            knownProducts.TryGetValue((ushort)device.VendorID, out productIds) &&
                            productIds.Contains((ushort)device.ProductID))
                        {
                            validDevice = true;
                        }
                    }
                    catch
                    {
                        ignoredDevices.Add(device.DevicePath);
                    }

                    if (validDevice)
                    {
                        HidStream stream;
                        if (device.TryOpen(out stream))
                        {
                            if (!stream.CanWrite)
                            {
                                stream.Close();
                                continue;
                            }

                            KeyboardState keyboardState = Handshake(stream);
                            if (keyboardState != null)
                            {
                                KeyboardDevice keyboardDevice = new KeyboardDevice();
                                keyboardDevice.State  = keyboardState;
                                keyboardDevice.stream = stream;
                                keyboardDevice.device = device;
                                connectedDevices[device.DevicePath] = keyboardDevice;
                                stream.Closed += (object sender, EventArgs e) =>
                                {
                                    keyboardDevice.Close();
                                    lock (connectedDevices)
                                    {
                                        connectedDevices.Remove(device.DevicePath);
                                    }
                                    if (Disconnected != null)
                                    {
                                        Disconnected(keyboardDevice);
                                    }
                                };
                                if (Connected != null)
                                {
                                    Connected(keyboardDevice);
                                }
                                keyboardDevice.StartPingThread();
                            }
                            else
                            {
                                Console.WriteLine("Keyboard handshake failed");
                                stream.Close();
                            }
                        }
                    }
                }
            }
        }