Beispiel #1
0
        /// <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;
                }
            }
        }