C#WindowsAPI库 > HID


提供对hid.dll的简单封装


using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace WindowsAPI
{
    /// <summary>
    /// 连接USB返回的结构体信息
    /// </summary>
    public enum HID_RETURN
    {
        SUCCESS = 0,
        NO_DEVICE_CONECTED,
        DEVICE_NOT_FIND,
        DEVICE_OPENED,
        WRITE_FAILD,
        READ_FAILD,
    }
    /// <summary>
    /// The HIDD_ATTRIBUTES structure contains vendor information about a HIDClass device
    /// </summary>
    public struct HIDD_ATTRIBUTES
    {
        public int Size;
        public ushort VendorID;
        public ushort ProductID;
        public ushort VersionNumber;
    }
    /// <summary>
    /// HIDP_CAPS 结构包含有关顶级 集合功能的信息。
    /// https://learn.microsoft.com/zh-cn/windows-hardware/drivers/ddi/hidpi/ns-hidpi-_hidp_caps
    /// </summary>
    public struct HIDP_CAP
    {
        /// <summary>
        /// 指定 顶级集合的使用情况 ID。
        /// </summary>
        public ushort Usage;
        /// <summary>
        /// 指定顶级集合的 使用情况页。
        /// </summary>
        public ushort UsagePage;
        /// <summary>
        /// 指定所有输入报告的最大大小(以字节为单位)。 包括报表数据前面追加的报表 ID。 如果未使用报表 ID,则 ID 值为零。
        /// </summary>
        public ushort InputReportByteLength;
        /// <summary>
        /// 指定所有输出报告的最大大小(以字节为单位)。 包括报表数据前面追加的报表 ID。 如果未使用报表 ID,则 ID 值为零。
        /// </summary>
        public ushort OutputReportByteLength;
        /// <summary>
        /// 指定所有功能报告的最大长度(以字节为单位)。 包括报表数据前面追加的报表 ID。 如果未使用报表 ID,则 ID 值为零。
        /// </summary>
        //public ushort FeatureReportByteLength;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
        public ushort[] Reserved;
        public ushort NumberLinkCollectionNodes;
        public ushort NumberInputButtonCaps;
        public ushort NumberInputValueCaps;
        public ushort NumberInputDataIndices;
        public ushort NumberOutputButtonCaps;
        public ushort NumberOutputValueCaps;
        public ushort NumberOutputDataIndices;
        public ushort NumberFeatureButtonCaps;
        public ushort NumberFeatureValueCaps;
        public ushort NumberFeatureDataIndices;
    }
    /// <summary>
    /// Serves as a standard header for information related to a device event reported through the WM_DEVICECHANGE message.
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct DEV_BROADCAST
    {
        public int dbcc_size;
        public int dbcc_devicetype;
        public int dbcc_reserved;
    }
    /// <summary>
    /// Contains information about a class of devices
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct DEV_BROADCAST_DEVICEINTER
    {
        public int dbcc_size;
        public int dbcc_devicetype;
        public int dbcc_reserved;
        public Guid dbcc_classguid;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
        public string dbcc_name;
    }
    /// <summary>
    /// 提供对hid.dll的简单封装
    /// </summary>
    public class HIDs
    {
        /// <summary>
        /// HidD_GetAttributes例程返回指定顶级集合的属性。
        /// </summary>
        /// <param name="HidDeviceObject">指定顶级集合的打开句柄。</param>
        /// <param name="Attributes">指向调用方分配 的HIDD_ATTRIBUTES 结构的指针,该结构返回 由 HidDeviceObject 指定的集合的属性。</param>
        /// <returns></returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_GetAttributes(IntPtr HidDeviceObject, out HIDD_ATTRIBUTES Attributes);
        /// <summary>
        /// HidD_GetSerialNumberString例程返回顶级集合的嵌入字符串,该字符串标识集合的物理设备的序列号。
        /// </summary>
        /// <param name="HidDeviceObject">指定顶级集合的打开句柄。</param>
        /// <param name="Buffer">指向调用方分配的缓冲区的指针,例程使用该缓冲区返回请求的序列号字符串。 例程返回以 NULL 结尾的宽字符串。</param>
        /// <param name="BufferLength">指定在 Buffer 中提供的调用方分配的缓冲区的长度(以字节 为单位)。 如果缓冲区不够大,无法返回以 NULL 结尾的整个嵌入字符串,则例程不会在缓冲区中返回任何内容。 提供的缓冲区必须为 <= 4093 字节 (2^12 – 3) 。</param>
        /// <returns>如果HidD_GetSerialNumberString 成功返回整个以 NULL 结尾的嵌入字符串,则返回 TRUE 。 否则,例程返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_GetSerialNumberString(IntPtr HidDeviceObject, IntPtr Buffer, int BufferLength);
        /// <summary>
        /// HidD_GetPreparsedData例程返回顶级集合的预分析数据。
        /// </summary>
        /// <param name="hidDeviceObject">指定顶级集合的打开句柄。</param>
        /// <param name="PreparsedData">指向例程分配的缓冲区的地址的指针,该缓冲区在 _HIDP_PREPARSED_DATA 结构中包含集合的预分析数据。</param>
        /// <returns>如果成功,HidD_GetPreparsedData 返回 TRUE ;否则,它将返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_GetPreparsedData(IntPtr hidDeviceObject, out IntPtr PreparsedData);
        /// <summary>
        /// HidD_FreePreparsedData例程释放 HID 类驱动程序分配用于保存顶级集合的预先分析数据的资源。
        /// </summary>
        /// <param name="PreparsedData">指向释放HidD_GetPreparsedData返回的缓冲区的指针。</param>
        /// <returns>如果成功,HidD_FreePreparsedData 返回 TRUE 。 否则,如果缓冲区不是预先分析的数据缓冲区,则返回 FALSE 。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_FreePreparsedData(IntPtr PreparsedData);
        /// <summary>
        /// HidP_GetCaps例程返回顶级集合的HIDP_CAPS结构。
        /// </summary>
        /// <param name="PreparsedData">指向顶级集合的 预分析数据的指针。</param>
        /// <param name="Capabilities">指向调用方分配的缓冲区的指针,例程使用该缓冲区返回集合的HIDP_CAPS结构。</param>
        /// <returns>HIDP_STATUS_SUCCESS 例程已成功返回收集功能信息。HIDP_STATUS_INVALID_PREPARSED_DATA 指定的预分析数据无效。</returns>
        [DllImport("hid.dll")]
        public static extern uint HidP_GetCaps(IntPtr PreparsedData, out HIDP_CAPS Capabilities);
        /// <summary>
        /// HidD_GetHidGuid例程返回 HIDClass 设备的设备接口GUID。
        /// </summary>
        /// <param name="HidGuid">指向调用方分配的 GUID 缓冲区的指针,例程使用该缓冲区 返回 HIDClass 设备的设备接口 GUID。</param>
        [DllImport("hid.dll")]
        public static extern void HidD_GetHidGuid(ref Guid HidGuid);
        /// <summary>
        /// HidD_FlushQueue例程删除顶级集合的输入队列中的所有挂起的输入报告。
        /// </summary>
        /// <param name="HidDeviceObject">指定刷新其输入队列的顶级集合的打开句柄。</param>
        /// <returns>如果成功刷新队列,则HidD_FlushQueue 返回 TRUE 。 否则,它将返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_FlushQueue([In] IntPtr HidDeviceObject);
        /// <summary>
        /// HidD_GetFeature例程从指定的顶级集合返回特征报告。
        /// </summary>
        /// <param name="HidDeviceObject">顶级集合的打开句柄。</param>
        /// <param name="ReportBuffer">指向调用方分配的 HID 报表缓冲区的指针,调用方使用该缓冲区指定报表 ID。 HidD_GetFeature 使用 ReportBuffer 返回指定的功能报告。</param>
        /// <param name="ReportBufferLength">报表缓冲区的大小(以字节为单位)。 报表缓冲区必须足够大,以便保存功能报告,以及一个指定非零报表 ID 的附加字节。 如果未使用报表 ID,则 ID 值为零。</param>
        /// <returns>如果 HidD_GetFeature 成功,则返回 TRUE;否则返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_GetFeature([In] IntPtr HidDeviceObject, [Out] IntPtr ReportBuffer, [In] long ReportBufferLength);
        /// <summary>
        /// 仅使用此例程获取集合的当前状态。 如果应用程序尝试使用此例程持续获取输入报告,则报表可能会丢失。 有关详细信息,请参阅 通过用户模式应用程序获取 HID 报表。
        /// https://learn.microsoft.com/zh-cn/windows-hardware/drivers/ddi/hidsdi/nf-hidsdi-hidd_getinputreport
        /// </summary>
        /// <param name="HidDeviceObject">顶级集合的打开句柄。</param>
        /// <param name="ReportBuffer">指向调用方分配的输入报表缓冲区的指针,调用方使用该缓冲区指定 HID 报表 ID, HidD_GetInputReport 使用 返回指定的输入报表。</param>
        /// <param name="ReportBufferLength">报表缓冲区的大小(以字节为单位)。 报表缓冲区必须足够大,才能保存输入报表以及一个指定报表 ID 的附加字节。 如果未使用报表 ID,则 ID 值为零。</param>
        /// <returns>如果成功,HidD_GetInputReport 返回 TRUE ;否则,它将返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_GetInputReport(IntPtr HidDeviceObject, IntPtr ReportBuffer, long ReportBufferLength);
        /// <summary>
        /// HidD_SetFeature例程将功能报告发送到顶级集合。
        /// </summary>
        /// <param name="HidDeviceObject">顶级集合的打开句柄。</param>
        /// <param name="ReportBuffer">指向调用方分配的功能报表缓冲区的指针,调用方使用该缓冲区指定 HID 报表 ID。</param>
        /// <param name="ReportBufferLength">报表缓冲区的大小(以字节为单位)。 报表缓冲区必须足够大,才能保存功能报表以及一个指定非零报表 ID 的附加字节。 如果未使用报表 ID,则 ID 值为零。</param>
        /// <returns>如果 HidD_SetFeature 成功,则返回 TRUE;否则,它将返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_SetFeature([In] IntPtr HidDeviceObject, [In] IntPtr ReportBuffer, [In] long ReportBufferLength);
        /// <summary>
        /// HidD_SetOutputReport例程将输出报告发送到顶级集合。
        /// 仅使用此例程设置集合的当前状态。 某些设备可能不支持此例程,如果使用此例程,将变得无响应。 有关详细信息,请参阅 通过 User-Mode 应用程序发送 HID 报告。
        /// </summary>
        /// <param name="HidDeviceObject">顶级集合的打开句柄。</param>
        /// <param name="ReportBuffer">指向调用方分配的输出报表缓冲区的指针,调用方使用该缓冲区指定报表 ID。</param>
        /// <param name="ReportBufferLength">报表缓冲区的大小(以字节为单位)。 报表缓冲区必须足够大,以便保存输出报告,以及一个指定非零报表 ID 的附加字节。 如果未使用报表 ID,则 ID 值为零。</param>
        /// <returns>如果 HidD_SetOutputReport 成功,则返回 TRUE;否则返回 FALSE。 使用 GetLastError 获取扩展错误信息。</returns>
        [DllImport("hid.dll")]
        public static extern Boolean HidD_SetOutputReport([In] IntPtr HidDeviceObject, [In] IntPtr ReportBuffer, [In] long ReportBufferLength);
    }
}