private static string GetUserDataFile(KeyboardDevice device) { return(Path.Combine(UserDataPath, device.State.ModelId + ".txt")); }
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(); } } } } } }