/// <summary> /// Refresh device. /// </summary> void RefreshDevice(DirectInput manager, UserDevice ud, DeviceInstance device, DeviceInfo[] allDevices, DeviceInfo[] allInterfaces, out DeviceInfo hid) { hid = null; if (Program.IsClosing) { return; } // If device added then... if (ud.Device == null) { try { // Getting state can fail. var joystick = new Joystick(manager, device.InstanceGuid); ud.Device = joystick; ud.IsExclusiveMode = null; ud.LoadCapabilities(joystick.Capabilities); } catch (Exception) { } } ud.LoadInstance(device); // If device is set as offline then make it online. if (!ud.IsOnline) { ud.IsOnline = true; } // Get device info for added devices. var dev = allDevices.FirstOrDefault(x => x.DeviceId == ud.HidDeviceId); ud.LoadDevDeviceInfo(dev); if (dev != null) { ud.ConnectionClass = DeviceDetector.GetConnectionDevice(dev, allDevices)?.ClassGuid ?? Guid.Empty; } // InterfacePath is available for HID devices. if (device.IsHumanInterfaceDevice && ud.Device != null) { var interfacePath = ud.Device.Properties.InterfacePath; hid = allInterfaces.FirstOrDefault(x => x.DevicePath == interfacePath); // Get interface info for added devices. ud.LoadHidDeviceInfo(hid); if (hid != null) { ud.ConnectionClass = DeviceDetector.GetConnectionDevice(hid, allDevices)?.ClassGuid ?? Guid.Empty; } // Workaround: // Override Device values and description from the Interface, // because it is more accurate and present. // Note 1: Device fields below, probably, should not be used. // Note 2: Available when device is online. ud.DevManufacturer = ud.HidManufacturer; ud.DevDescription = ud.HidDescription; ud.DevVendorId = ud.HidVendorId; ud.DevProductId = ud.HidProductId; ud.DevRevision = ud.HidRevision; } }
/// <summary> /// Refresh device. /// </summary> void RefreshDevice(DirectInput manager, UserDevice ud, DeviceInstance instance, DeviceInfo[] allDevices, DeviceInfo[] allInterfaces, out DeviceInfo hid) { hid = null; if (Program.IsClosing) { return; } // If device added then... if (ud.Device == null) { try { // Lock to avoid Exception: Collection was modified; enumeration operation may not execute. lock (SettingsManager.UserDevices.SyncRoot) { Device device; //if (instance.Type == DeviceType.Mouse) // device = new Mouse(manager); //else if (instance.Type == DeviceType.Keyboard) // device = new Keyboard(manager); //else device = new Joystick(manager, instance.InstanceGuid); ud.Device = device; ud.IsExclusiveMode = null; ud.LoadCapabilities(device.Capabilities); } } catch (Exception) { } } // Lock to avoid Exception: Collection was modified; enumeration operation may not execute. lock (SettingsManager.UserDevices.SyncRoot) { ud.LoadInstance(instance); } // If device is set as offline then make it online. if (!ud.IsOnline) { lock (SettingsManager.UserDevices.SyncRoot) ud.IsOnline = true; } // Get device info for added devices. var dev = allDevices.FirstOrDefault(x => x.DeviceId == ud.HidDeviceId); // Lock to avoid Exception: Collection was modified; enumeration operation may not execute. lock (SettingsManager.UserDevices.SyncRoot) { ud.LoadDevDeviceInfo(dev); if (dev != null) { ud.ConnectionClass = DeviceDetector.GetConnectionDevice(dev, allDevices)?.ClassGuid ?? Guid.Empty; } } // InterfacePath is available for HID devices. if (instance.IsHumanInterfaceDevice && ud.Device != null) { var interfacePath = ud.Device.Properties.InterfacePath; // Get interface info for added devices. hid = allInterfaces.FirstOrDefault(x => x.DevicePath == interfacePath); // Lock to avoid Exception: Collection was modified; enumeration operation may not execute. lock (SettingsManager.UserDevices.SyncRoot) { ud.LoadHidDeviceInfo(hid); if (hid != null) { ud.ConnectionClass = DeviceDetector.GetConnectionDevice(hid, allDevices)?.ClassGuid ?? Guid.Empty; } // Workaround: // Override Device values and description from the Interface, // because it is more accurate and present. // Note 1: Device fields below, probably, should not be used. // Note 2: Available when device is online. ud.DevManufacturer = ud.HidManufacturer; ud.DevDescription = ud.HidDescription; ud.DevVendorId = ud.HidVendorId; ud.DevProductId = ud.HidProductId; ud.DevRevision = ud.HidRevision; } } }