Exemple #1
0
    /// <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);
    }
Exemple #2
0
        /// <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());
                }
            }
        }