/// <summary> /// List all attached devices with specific VID_PID /// </summary> /// <param name="vendorID">device vendor ID</param> /// <param name="productID">device product ID</param> /// <param name="devicePathName">list of path name to open device with CreateFile()</param> /// <returns></returns> public static int FindDevices(short vendorID, short productID, ref string[] devicePathName) { string[] hidDevicePathName = new string[0]; int i = 0; int numberOfDevicesFound = 0; SafeFileHandle deviceHandle; bool result = false; Win32.HIDD_ATTRIBUTES deviceAttributes = new Win32.HIDD_ATTRIBUTES(); FindHidDevice(ref hidDevicePathName); devicePathName = new string[0]; for (i = 0; i < hidDevicePathName.Length; i++) { deviceHandle = Win32.CreateFile(hidDevicePathName[i], 0, Win32.FILE_SHARE_READ | Win32.FILE_SHARE_WRITE, IntPtr.Zero, Win32.OPEN_EXISTING, 0, 0); if (!deviceHandle.IsInvalid) { result = Win32.HidD_GetAttributes(deviceHandle, ref deviceAttributes); if (result && deviceAttributes.ProductID == productID && deviceAttributes.VendorID == vendorID) { numberOfDevicesFound += 1; Array.Resize(ref devicePathName, numberOfDevicesFound); devicePathName[numberOfDevicesFound - 1] = hidDevicePathName[i]; } deviceHandle.Close(); } } return(numberOfDevicesFound); }
/// <summary> /// Private constructor. /// </summary> /// <param name="hRawInputDevice"></param> private void Construct(IntPtr hRawInputDevice) { PreParsedData = IntPtr.Zero; iInputButtonCapabilities = null; iInputValueCapabilities = null; //Fetch various information defining the given HID device Name = Win32.RawInput.GetDeviceName(hRawInputDevice); //Fetch device info iInfo = new RID_DEVICE_INFO(); if (!Win32.RawInput.GetDeviceInfo(hRawInputDevice, ref iInfo)) { throw new Exception("HidDevice: GetDeviceInfo failed: " + Marshal.GetLastWin32Error().ToString()); } //Open our device from the device name/path SafeFileHandle handle = Win32.Function.CreateFile(Name, Win32.FileAccess.NONE, Win32.FileShare.FILE_SHARE_READ | Win32.FileShare.FILE_SHARE_WRITE, IntPtr.Zero, Win32.CreationDisposition.OPEN_EXISTING, Win32.FileFlagsAttributes.FILE_FLAG_OVERLAPPED, IntPtr.Zero ); //Check if CreateFile worked if (handle.IsInvalid) { throw new Exception("HidDevice: CreateFile failed: " + Marshal.GetLastWin32Error().ToString()); } //Get manufacturer string StringBuilder manufacturerString = new StringBuilder(256); if (Win32.Function.HidD_GetManufacturerString(handle, manufacturerString, manufacturerString.Capacity)) { Manufacturer = manufacturerString.ToString(); } //Get product string StringBuilder productString = new StringBuilder(256); if (Win32.Function.HidD_GetProductString(handle, productString, productString.Capacity)) { Product = productString.ToString(); } //Get attributes Win32.HIDD_ATTRIBUTES attributes = new Win32.HIDD_ATTRIBUTES(); if (Win32.Function.HidD_GetAttributes(handle, ref attributes)) { VendorId = attributes.VendorID; ProductId = attributes.ProductID; Version = attributes.VersionNumber; } handle.Close(); SetFriendlyName(); //Get our HID descriptor pre-parsed data PreParsedData = Win32.RawInput.GetPreParsedData(hRawInputDevice); if (PreParsedData == IntPtr.Zero) { //We are done then. //Some devices don't have pre-parsed data. return; } //Get capabilities HidStatus status = Win32.Function.HidP_GetCaps(PreParsedData, ref iCapabilities); if (status != HidStatus.HIDP_STATUS_SUCCESS) { throw new Exception("HidDevice: HidP_GetCaps failed: " + status.ToString()); } SetInputCapabilitiesDescription(); //Get input button caps if needed if (Capabilities.NumberInputButtonCaps > 0) { iInputButtonCapabilities = new HIDP_BUTTON_CAPS[Capabilities.NumberInputButtonCaps]; ushort buttonCapabilitiesLength = Capabilities.NumberInputButtonCaps; status = Win32.Function.HidP_GetButtonCaps(HIDP_REPORT_TYPE.HidP_Input, iInputButtonCapabilities, ref buttonCapabilitiesLength, PreParsedData); if (status != HidStatus.HIDP_STATUS_SUCCESS || buttonCapabilitiesLength != Capabilities.NumberInputButtonCaps) { throw new Exception("HidDevice: HidP_GetButtonCaps failed: " + status.ToString()); } ComputeButtonCount(); } //Get input value caps if needed if (Capabilities.NumberInputValueCaps > 0) { iInputValueCapabilities = new HIDP_VALUE_CAPS[Capabilities.NumberInputValueCaps]; ushort valueCapabilitiesLength = Capabilities.NumberInputValueCaps; status = Win32.Function.HidP_GetValueCaps(HIDP_REPORT_TYPE.HidP_Input, iInputValueCapabilities, ref valueCapabilitiesLength, PreParsedData); if (status != HidStatus.HIDP_STATUS_SUCCESS || valueCapabilitiesLength != Capabilities.NumberInputValueCaps) { throw new Exception("HidDevice: HidP_GetValueCaps failed: " + status.ToString()); } } }