提供对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);
}
}