public static DeviceEffectItem[] GetDeviceEffects(Joystick device) { var items = new List <DeviceEffectItem>(); if (device == null) { return(items.ToArray()); } // Check if device supports force feedback. var forceFeedback = device.Capabilities.Flags.HasFlag(DeviceFlags.ForceFeedback); if (!forceFeedback) { return(items.ToArray()); } lock (XInput.XInputLock) { // Unload xinput. var isLoaded = XInput.IsLoaded; if (isLoaded) { XInput.FreeLibrary(); } // Must reaquire device in exclusive mode to get effects. device.Unacquire(); device.SetCooperativeLevel(MainForm.Current.Handle, CooperativeLevel.Foreground | CooperativeLevel.Exclusive); IList <EffectInfo> effects = new List <EffectInfo>(); try { device.Acquire(); effects = device.GetEffects(EffectType.All); } catch (Exception) { } foreach (var eff in effects) { items.Add(new DeviceEffectItem() { Name = eff.Name, StaticParameters = eff.StaticParameters, DynamicParameters = eff.DynamicParameters, }); } // Reaquire device in non exclusive mode. device.Unacquire(); device.SetCooperativeLevel(MainForm.Current.Handle, CooperativeLevel.Background | CooperativeLevel.NonExclusive); // If XInput was loaded then... if (isLoaded) { Exception error; XInput.ReLoadLibrary(XInput.LibraryName, out error); } } return(items.ToArray()); }
void ShowDeviceInfo(Joystick device) { if (device == null) { // clean everything here. SetValue(DeviceProductNameTextBox, ""); SetValue(DeviceProductGuidTextBox, ""); SetValue(DeviceInstanceGuidTextBox, ""); DiCapFfStateTextBox.Text = string.Empty; DiCapAxesTextBox.Text = string.Empty; DiCapButtonsTextBox.Text = string.Empty; DiCapDPadsTextBox.Text = string.Empty; DiEffectsTable.Rows.Clear(); return; } lock (MainForm.XInputLock) { var isLoaded = XInput.IsLoaded; if (isLoaded) { XInput.FreeLibrary(); } device.Unacquire(); device.SetCooperativeLevel(MainForm.Current, CooperativeLevel.Foreground | CooperativeLevel.Exclusive); effects = new List <EffectInfo>(); try { device.Acquire(); var forceFeedback = device.Capabilities.Flags.HasFlag(DeviceFlags.ForceFeedback); forceFeedbackState = forceFeedback ? "YES" : "NO"; effects = device.GetEffects(EffectType.All); } catch (Exception) { forceFeedbackState = "ERROR"; } DiEffectsTable.Rows.Clear(); foreach (var eff in effects) { DiEffectsTable.Rows.Add(new object[] { eff.Name, ((EffectParameterFlags)eff.StaticParameters).ToString(), ((EffectParameterFlags)eff.DynamicParameters).ToString() }); } device.Unacquire(); device.SetCooperativeLevel(MainForm.Current, CooperativeLevel.Background | CooperativeLevel.NonExclusive); if (isLoaded) { Exception error; XInput.ReLoadLibrary(XInput.LibraryName, out error); } } DiCapFfStateTextBox.Text = forceFeedbackState; DiCapButtonsTextBox.Text = device.Capabilities.ButtonCount.ToString(); DiCapDPadsTextBox.Text = device.Capabilities.PovCount.ToString(); var objects = device.GetObjects(DeviceObjectTypeFlags.All).OrderBy(x => x.Offset).ToArray(); DiObjectsTable.Rows.Clear(); var og = typeof(SharpDX.DirectInput.ObjectGuid); var guidFileds = og.GetFields().Where(x => x.FieldType == typeof(Guid)); List <Guid> guids = guidFileds.Select(x => (Guid)x.GetValue(og)).ToList(); List <string> names = guidFileds.Select(x => x.Name).ToList(); foreach (var o in objects) { DiObjectsTable.Rows.Add(new object[] { o.Offset, o.ObjectId.InstanceNumber, o.Usage, o.Name, o.Aspect, guids.Contains(o.ObjectType) ? names[guids.IndexOf(o.ObjectType)] : o.ObjectType.ToString(), o.ObjectId.Flags, }); } var actuators = objects.Where(x => x.ObjectId.Flags.HasFlag(DeviceObjectTypeFlags.ForceFeedbackActuator)); ActuatorsTextBox.Text = actuators.Count().ToString(); var di = device.Information; var slidersCount = objects.Where(x => x.ObjectType.Equals(SharpDX.DirectInput.ObjectGuid.Slider)).Count(); DiCapAxesTextBox.Text = (device.Capabilities.AxeCount - slidersCount).ToString(); SlidersTextBox.Text = slidersCount.ToString(); // Update pid and vid always so they wont be overwritten by load settings. short vid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 0); short pid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 2); SetValue(DeviceVidTextBox, "0x{0}", vid.ToString("X4")); SetValue(DevicePidTextBox, "0x{0}", pid.ToString("X4")); SetValue(DeviceProductNameTextBox, di.ProductName); SetValue(DeviceProductGuidTextBox, di.ProductGuid.ToString()); SetValue(DeviceInstanceGuidTextBox, di.InstanceGuid.ToString()); SetValue(DeviceTypeTextBox, di.Type.ToString()); }
void ShowDeviceInfo(Joystick device, DeviceInfo dInfo) { if (device == null) { // clean everything here. SetValue(DeviceProductNameTextBox, ""); SetValue(DeviceVendorNameTextBox, ""); SetValue(DeviceProductGuidTextBox, ""); SetValue(DeviceInstanceGuidTextBox, ""); DiCapFfStateTextBox.Text = string.Empty; DiCapAxesTextBox.Text = string.Empty; DiCapButtonsTextBox.Text = string.Empty; DiCapDPadsTextBox.Text = string.Empty; DiEffectsTable.Rows.Clear(); return; } lock (MainForm.XInputLock) { var isLoaded = XInput.IsLoaded; if (isLoaded) { XInput.FreeLibrary(); } device.Unacquire(); device.SetCooperativeLevel(MainForm.Current, CooperativeLevel.Foreground | CooperativeLevel.Exclusive); effects = new List <EffectInfo>(); try { device.Acquire(); var forceFeedback = device.Capabilities.Flags.HasFlag(DeviceFlags.ForceFeedback); forceFeedbackState = forceFeedback ? "YES" : "NO"; effects = device.GetEffects(EffectType.All); } catch (Exception) { forceFeedbackState = "ERROR"; } DiEffectsTable.Rows.Clear(); foreach (var eff in effects) { DiEffectsTable.Rows.Add(new object[] { eff.Name, ((EffectParameterFlags)eff.StaticParameters).ToString(), ((EffectParameterFlags)eff.DynamicParameters).ToString() }); } device.Unacquire(); device.SetCooperativeLevel(MainForm.Current, CooperativeLevel.Background | CooperativeLevel.NonExclusive); if (isLoaded) { Exception error; XInput.ReLoadLibrary(XInput.LibraryName, out error); } } DiCapFfStateTextBox.Text = forceFeedbackState; DiCapButtonsTextBox.Text = device.Capabilities.ButtonCount.ToString(); DiCapDPadsTextBox.Text = device.Capabilities.PovCount.ToString(); var objects = AppHelper.GetDeviceObjects(device); DiObjectsDataGridView.DataSource = objects; var actuators = objects.Where(x => x.Flags.HasFlag(DeviceObjectTypeFlags.ForceFeedbackActuator)); ActuatorsTextBox.Text = actuators.Count().ToString(); var di = device.Information; var slidersCount = objects.Where(x => x.GuidValue.Equals(SharpDX.DirectInput.ObjectGuid.Slider)).Count(); DiCapAxesTextBox.Text = (device.Capabilities.AxeCount - slidersCount).ToString(); SlidersTextBox.Text = slidersCount.ToString(); // Update PID and VID always so they wont be overwritten by load settings. short vid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 0); short pid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 2); SetValue(DeviceVidTextBox, "0x{0}", vid.ToString("X4")); SetValue(DevicePidTextBox, "0x{0}", pid.ToString("X4")); SetValue(DeviceProductNameTextBox, di.ProductName); SetValue(DeviceVendorNameTextBox, dInfo == null ? "" : dInfo.Manufacturer); SetValue(DeviceProductGuidTextBox, di.ProductGuid.ToString()); SetValue(DeviceInstanceGuidTextBox, di.InstanceGuid.ToString()); SetValue(DeviceTypeTextBox, di.Type.ToString()); }
void ShowDeviceInfo(Joystick device, UserDevice dInfo) { if (device == null) { // clean everything here. AppHelper.SetText(DiCapFfStateTextBox, ""); AppHelper.SetText(DiCapButtonsTextBox, ""); AppHelper.SetText(DiCapPovsTextBox, ""); AppHelper.SetText(ActuatorsTextBox, ""); AppHelper.SetText(DiCapAxesTextBox, ""); AppHelper.SetText(DiSlidersTextBox, ""); AppHelper.SetText(DeviceVidTextBox, ""); AppHelper.SetText(DevicePidTextBox, ""); AppHelper.SetText(DeviceRevTextBox, ""); AppHelper.SetText(DeviceProductNameTextBox, ""); AppHelper.SetText(DeviceVendorNameTextBox, ""); AppHelper.SetText(DeviceProductGuidTextBox, ""); AppHelper.SetText(DeviceInstanceGuidTextBox, ""); AppHelper.SetText(DeviceTypeTextBox, ""); if (DiEffectsTable.Rows.Count > 0) { DiEffectsTable.Rows.Clear(); } return; } lock (XInput.XInputLock) { // This must be done for the first time device is connected in order to retrieve // Force feedback information. // XInput must be unloaded in case it tries to lock the device exclusivly. var isLoaded = XInput.IsLoaded; if (isLoaded) { XInput.FreeLibrary(); } var forceFeedback = device.Capabilities.Flags.HasFlag(DeviceFlags.ForceFeedback); forceFeedbackState = forceFeedback ? "YES" : "NO"; if (DiEffectsTable.Rows.Count > 0) { DiEffectsTable.Rows.Clear(); } // If device supports force feedback then... if (forceFeedback) { // Must reaquire device in exclusive mode to get effects. device.Unacquire(); device.SetCooperativeLevel(MainForm.Current.Handle, CooperativeLevel.Foreground | CooperativeLevel.Exclusive); IList <EffectInfo> effects = new List <EffectInfo>(); try { device.Acquire(); effects = device.GetEffects(EffectType.All); } catch (Exception) { forceFeedbackState = "ERROR"; } foreach (var eff in effects) { DiEffectsTable.Rows.Add( eff.Name, eff.StaticParameters.ToString(), eff.DynamicParameters.ToString() ); } } // Reaquire device in non exclusive mode. device.Unacquire(); device.SetCooperativeLevel(MainForm.Current.Handle, CooperativeLevel.Background | CooperativeLevel.NonExclusive); if (isLoaded) { Exception error; XInput.ReLoadLibrary(XInput.LibraryName, out error); } } AppHelper.SetText(DiCapFfStateTextBox, forceFeedbackState); AppHelper.SetText(DiCapButtonsTextBox, device.Capabilities.ButtonCount.ToString()); AppHelper.SetText(DiCapPovsTextBox, device.Capabilities.PovCount.ToString()); var di = device.Information; var objects = TestDeviceHelper.ProductGuid.Equals(di.ProductGuid) ? TestDeviceHelper.GetDeviceObjects() : AppHelper.GetDeviceObjects(device); DiObjectsDataGridView.DataSource = objects; var actuators = objects.Where(x => x.Flags.HasFlag(DeviceObjectTypeFlags.ForceFeedbackActuator)); AppHelper.SetText(ActuatorsTextBox, actuators.Count().ToString()); var slidersCount = objects.Where(x => x.Type.Equals(SharpDX.DirectInput.ObjectGuid.Slider)).Count(); // https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.dijoystate2(v=vs.85).aspx AppHelper.SetText(DiCapAxesTextBox, (device.Capabilities.AxeCount - slidersCount).ToString()); AppHelper.SetText(DiSlidersTextBox, slidersCount.ToString()); // Update PID and VID always so they wont be overwritten by load settings. short vid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 0); short pid = BitConverter.ToInt16(di.ProductGuid.ToByteArray(), 2); AppHelper.SetText(DeviceVidTextBox, "0x{0:X4}", vid); AppHelper.SetText(DevicePidTextBox, "0x{0:X4}", pid); AppHelper.SetText(DeviceProductNameTextBox, di.ProductName); AppHelper.SetText(DeviceVendorNameTextBox, dInfo == null ? "" : dInfo.DevManufacturer); AppHelper.SetText(DeviceRevTextBox, "0x{0:X4}", dInfo == null ? 0 : dInfo.DevRevision); AppHelper.SetText(DeviceProductGuidTextBox, di.ProductGuid.ToString()); AppHelper.SetText(DeviceInstanceGuidTextBox, di.InstanceGuid.ToString()); AppHelper.SetText(DeviceTypeTextBox, di.Type.ToString()); }