/// <summary> /// Get all Hid devices currently connected to the PC. /// </summary> /// <returns> /// The Enumerable of Hid Devices. /// </returns> internal static IEnumerable <HidInformation> GetHidObjects() { var response = new List <HidInformation>(); // Iterate through all items found and connect to the first one that we // Gain a valid windowHandle from. foreach (var hidItem in GetHidPaths()) { bool isReadOnly = false; var deviceHandle = OpenDevice(hidItem, ref isReadOnly); // We don't have a Valid Device. if (deviceHandle.IsInvalid) { deviceHandle.Dispose(); continue; } var deviceInformation = new HidInformation { DevicePath = hidItem, IsReadOnly = isReadOnly }; IntPtr parsedData; if (!HidD_GetPreparsedData(deviceHandle, out parsedData)) { HidD_FreePreparsedData(ref parsedData); continue; } try { HidAttributes temp; HidD_GetAttributes(deviceHandle, out temp); deviceInformation.HidAttributes = temp; HidCaps caps; HidP_GetCaps(parsedData, out caps); deviceInformation.Capabilities = caps; ReadDeviceCapabilities(caps, parsedData, ref deviceInformation); response.Add(deviceInformation); } catch { Console.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).Message); } finally { HidD_FreePreparsedData(ref parsedData); deviceHandle.Dispose(); } } return(response); }
/// <summary> /// The read capabilities. /// </summary> /// <param name="caps"> /// The caps. /// </param> /// <param name="pointer"> /// The pointer. /// </param> /// <param name="hidInformation"> /// The Device Information. /// </param> internal static void ReadDeviceCapabilities(HidCaps caps, IntPtr pointer, ref HidInformation hidInformation) { if (caps.NumberOutputValueCaps > 0) { hidInformation.OutputValues.ValueCaps = new HidValueCaps[caps.NumberOutputValueCaps]; HidP_GetValueCaps( HidReportType.Output, hidInformation.OutputValues.ValueCaps, ref caps.NumberOutputValueCaps, pointer); } if (caps.NumberOutputButtonCaps > 0) { hidInformation.OutputValues.ValueButtons = new HidButtonCaps[caps.NumberOutputButtonCaps]; HidP_GetButtonCaps( HidReportType.Output, hidInformation.OutputValues.ValueButtons, ref caps.NumberOutputButtonCaps, pointer); } if (caps.NumberInputValueCaps > 0) { hidInformation.InputValues.ValueCaps = new HidValueCaps[caps.NumberInputValueCaps]; HidP_GetValueCaps( HidReportType.Input, hidInformation.InputValues.ValueCaps, ref caps.NumberInputValueCaps, pointer); } if (caps.NumberInputButtonCaps > 0) { hidInformation.InputValues.ValueButtons = new HidButtonCaps[caps.NumberInputButtonCaps]; HidP_GetButtonCaps( HidReportType.Input, hidInformation.InputValues.ValueButtons, ref caps.NumberInputButtonCaps, pointer); } if (caps.NumberFeatureValueCaps > 0) { hidInformation.FeatureValues.ValueCaps = new HidValueCaps[caps.NumberFeatureValueCaps]; HidP_GetValueCaps( HidReportType.Feature, hidInformation.FeatureValues.ValueCaps, ref caps.NumberFeatureValueCaps, pointer); } if (caps.NumberFeatureButtonCaps <= 0) { return; } hidInformation.FeatureValues.ValueButtons = new HidButtonCaps[caps.NumberFeatureButtonCaps]; HidP_GetButtonCaps( HidReportType.Feature, hidInformation.FeatureValues.ValueButtons, ref caps.NumberFeatureButtonCaps, pointer); }