【发布时间】:2014-05-07 11:41:34
【问题描述】:
我创建了自己的可配置键盘设备(我可以更改任何键的代码)。 现在我正在尝试编写 C# 应用程序,它将与此设备进行通信,但我遇到了问题。
键盘设备报告描述符:
//Keyboard
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255) //0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION
/*65*/
//Device Configuration
0x06, 0xFF, 0xA0, // USAGE_PAGE (Vendor-Defined)
0x09, 0x01, // USAGE (Vendor-Defined)
0xA1, 0x01, // COLLECTION (Application)
0x85, 0x02, // REPORT_ID (2)
0x09, 0x03, // USAGE (Vendor-Defined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x95, 0x2D, // REPORT_COUNT (45)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // Input (Data, Variable, Absolute)
0x09, 0x04, // USAGE (Vendor-Defined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x95, 0x2D, // REPORT_COUNT (45)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // Output (Data, Variable, Absolute)
0x09, 0x05, // USAGE (Vendor-Defined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x95, 0x2D, // REPORT_COUNT (45)
0x75, 0x08, // REPORT_SIZE (8)
0xB1, 0x02, // Feature (Data, Variable, Absolute)
0xc0, // END_COLLECTION
部分 C# 代码(我正在使用 HIDLibrary):
Device = HidDevices.Enumerate(VendorID, ProductID).FirstOrDefault();
if (Device == null)
{
return;
}
//Open Device
Device.OpenDevice();
//if( Device.IsOpen == false )
// return;
Device.Inserted += DeviceAttachedHandler;
Device.Removed += DeviceRemovedHandler;
Device.MonitorDeviceEvents = true;
//Handle Reports
KeyMapRequest(); //Fill Buffer with KeyMapRequest
HidReport report = Device.CreateReport();
report.ReportId = 2;
report.Data = USBBuffer;
succeed = Device.WriteReport(report, 10);
Device.ReadReport(OnReport);
LastDataEventDate = DateTime.Now;
while ((DateTime.Now - LastDataEventDate).TotalMilliseconds < 100)
{
}
键盘工作正常,但应用程序无法与设备通信。 “Device.IsOpen”始终为“假”。 但是,当我使用“Report_ID (1)”(键盘部分)从 Report Descriptor 部分中删除时,“Device.IsOpen”为“true”,并且通信工作正常。
Windows 是否负责阻止通信?我该如何处理? 或者我在描述符中有一些错误?
【问题讨论】: