我发现这是相关主题:Windows virtual mouse driver
但是它不能解决我的问题。 我正在基于vhidmini示例编写kmdf虚拟鼠标驱动程序。
驱动程序安装正常,我可以在设备管理器中看到HID兼容的鼠标设备正在运行,但是看起来系统由于某种原因不接受该设备,因为鼠标没有移动。
我正在使用的描述符如下:
HID_REPORT_DESCRIPTOR G_DefaultReportDescriptor[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xA1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE_PAGE (Pointer)
0xA1, 0x00, // COLLECTION (Physical)
0x85, M_CONTROL_FEATURE_REPORT_ID, // REPORT_ID (1)
0x05, 0x09, // USAGE_PAGE (Buttons)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x03, // USAGE_MAXIMUM (3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data, Variable, Absolute) ; 3 button bits
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x01, // INPUT (Constant)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7F, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x06, // Input (Data, Variable, Relative) ; 2 position bytes (X&Y)
0xC0, // END_COLLECTION
0xC0, // END_COLLECTION
0x06,0x00, 0xFF, // USAGE_PAGE (Vendor Defined Usage Page)
0x09,0x01, // USAGE (Vendor Usage 0x01)
0xA1,0x01, // COLLECTION (Application)
0x85,CONTROL_FEATURE_REPORT_ID, // REPORT_ID (1)
0x09,0x01, // USAGE (Vendor Usage 0x01)
0x15,0x00, // LOGICAL_MINIMUM(0)
0x26,0xff, 0x00, // LOGICAL_MAXIMUM(255)
0x75,0x08, // REPORT_SIZE (0x08)
0x96,(FEATURE_REPORT_SIZE_CB & 0xff), (FEATURE_REPORT_SIZE_CB >> 8), // REPORT_COUNT
0xB1,0x00, // FEATURE (Data,Ary,Abs)
0x09,0x01, // USAGE (Vendor Usage 0x01)
0x75,0x08, // REPORT_SIZE (0x08)
0x96,(INPUT_REPORT_SIZE_CB & 0xff), (INPUT_REPORT_SIZE_CB >> 8), // REPORT_COUNT
0x81,0x00, // INPUT (Data,Ary,Abs)
0x09,0x01, // USAGE (Vendor Usage 0x01)
0x75,0x08, // REPORT_SIZE (0x08)
0x96,(OUTPUT_REPORT_SIZE_CB & 0xff), (OUTPUT_REPORT_SIZE_CB >> 8), //REPORT_COUNT
0x91,0x00, // OUTPUT (Data,Ary,Abs)
0xC0, // END_COLLECTION
};
因此,有2个TLC,其中1个物理用于OS,第二个TLC由我控制(打开设备和硬鼠标)。
我正在使用的输入报告是这样的:
typedef struct _HIDMINI_INPUT_REPORT{
UCHAR ReportId;
UCHAR Buttons;
UCHAR X;
UCHAR Y;
} HIDMINI_INPUT_REPORT, *PHIDMINI_INPUT_REPORT;
到目前为止,我可以观察到的是:驱动程序启动后,其查询如下:IOCTL_HID_GET_DEVICE_DESCRIPTOR,IOCTL_HID_GET_DEVICE_ATTRIBUTES和IOCTL_HID_GET_REPORT_DESCRIPTOR。很好 之后,使用IOCTL_HID_READ_REPORT对其进行查询,该消息将发送到手动队列(与vhidmini示例中的完全相同),并且experied计时器正在提供数据。
我的猜测是报告的结构或报告ID出问题,但我暂时坚持。 也许你可以帮我。
谢谢