首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows虚拟鼠标驱动程序

Windows虚拟鼠标驱动程序
EN

Stack Overflow用户
提问于 2017-12-22 13:28:58
回答 3查看 9.8K关注 0票数 5

我正在开发一个KMDF虚拟鼠标驱动程序。

总的想法是一个KMDF根枚举的非过滤器驱动程序,它将能够发送输出报告到鼠标和键盘驱动程序栈。

我的驱动程序已经在工作,并向其他驱动程序堆栈发送请求,但没有结果。

报告类型和数据包格式在Microsoft资源上是非常没有文档的。没有关于移动鼠标指针、模拟单击(使用鼠标或键盘)需要发送哪些数据和设备的信息。

只有关于HID客户端、驱动程序等的一般信息。它们的文档通常引用Windows驱动程序示例git存储库,但是存储库不包含任何与我的任务接近的源。很少有人在开发驱动程序,所以也没有教程。

我希望能给我一个提示,我可以在哪里找到更多关于我的任务。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-16 19:35:15

下面是我的工作驱动程序的报表描述符集。

代码语言:javascript
运行
复制
HID_REPORT_DESCRIPTOR g_reportDescriptor[] = {
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x02,     // USAGE (Mouse)
    0xA1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_MOUSE_INPUT,
    0x09, 0x01,         // USAGE_PAGE (Pointer)
    0xA1, 0x00,         // COLLECTION (Physical)
    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)
    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)
    0xC0,               // END_COLLECTION
    0xC0,           // END_COLLECTION

    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x00,     // USAGE (Undefined)
    0xa1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_MOUSE_OUTPUT,
    0x09, 0x00,         // USAGE (Undefined)
    0x15, 0x00,         // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,   // LOGICAL_MAXIMUM (255)
    0x95, 0x03,         // REPORT_COUNT (3)
    0x75, 0x08,         // REPORT_SIZE (8)
    0x91, 0x02,         // OUTPUT (Data, Variable, Absolute)
    0xc0,           // END_COLLECTION

    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,     // USAGE (Keyboard)
    0xA1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_KEYBOARD_INPUT,
    0x05, 0x07,         // USAGE_PAGE (Keyboard Key Codes)
    0x19, 0xE0,         // USAGE_MINIMUM (224)
    0x29, 0xE7,         // USAGE_MAXIMUM (231)
    0x15, 0x00,         // LOGICAL_MINIMUM (0)
    0x25, 0x01,         // LOGICAL_MAXIMUM (1)
    0x75, 0x01,         // REPORT_SIZE (1)
    0x95, 0x08,         // REPORT_COUNT (8)
    0x81, 0x02,         // INPUT (Data, Variable, Absolute)
    0x95, 0x01,         // REPORT_COUNT (1)
    0x75, 0x08,         // REPORT_SIZE (8)
    0x81, 0x01,         // INPUT (Constant)
    0x19, 0x00,         // USAGE_MINIMUM (0)
    0x29, 0x65,         // USAGE_MAXIMUM (101)
    0x15, 0x00,         // LOGICAL_MINIMUM (0)
    0x25, 0x65,         // LOGICAL_MAXIMUM (101)
    0x95, 0x06,         // REPORT_COUNT (6)
    0x75, 0x08,         // REPORT_SIZE (8)
    0x81, 0x00,         // INPUT (Data, Array, Absolute)
    0x05, 0x08,         // USAGE_PAGE (LEDs)
    0x19, 0x01,         // USAGE_MINIMUM (Num Lock)
    0x29, 0x05,         // USAGE_MAXIMUM (Kana)
    0x95, 0x05,         // REPORT_COUNT (5)
    0x75, 0x01,         // REPORT_SIZE (1)
    0x91, 0x02,         // OUTPUT (Data, Variable, Absolute)
    0x95, 0x01,         // REPORT_COUNT (1)
    0x75, 0x03,         // REPORT_SIZE (3)
    0x91, 0x01,         // OUTPUT (Constant)
    0xC0,           // END_COLLECTION

    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x00,     // USAGE (Undefined)
    0xa1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_KEYBOARD_OUTPUT,
    0x09, 0x00,         // USAGE (Undefined)
    0x15, 0x00,         // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,   // LOGICAL_MAXIMUM (255)
    0x95, 0x08,         // REPORT_COUNT (8)
    0x75, 0x08,         // REPORT_SIZE (8)
    0x91, 0x02,         // OUTPUT (Data, Variable, Absolute)
    0xc0            // END_COLLECTION
};

它包括:

  1. 鼠标输入(向Windows鼠标堆栈发送数据的设备)
  2. 鼠标输出(用于向我的驱动程序发送鼠标输入的设备)
  3. 键盘输入(向Windows键盘堆栈发送数据的设备)
  4. 键盘输出(用于向驱动程序发送键盘输入的设备)
票数 0
EN

Stack Overflow用户

发布于 2017-12-30 13:48:38

刘杰的回答已经指向了正确的方向。现在模仿鼠标的最好方法就是模仿USB硬件。

如果您的虚拟鼠标数据来自您控制的硬件,您还可以跳过驱动程序部分并使您的硬件HID兼容。

如果我们说的是一个纯粹的软件仿真,我认为你最好的选择是模仿一个将自己定位为HID设备的USB设备。有一个伟大的MSDN文章创建您自己的USB设备仿真。好的是,他们使用HID作为一个示例USB描述符:

代码语言:javascript
运行
复制
const UCHAR g_UsbDeviceDescriptor[] = {
    // Device Descriptor
    0x12, // Descriptor Size
    0x01, // Device Descriptor Type
    0x00, 0x03, // USB 3.0
    0x00, // Device class
    0x00, // Device sub-class
    0x00, // Device protocol
    0x09, // Maxpacket size for EP0 : 2^9
    0x5E, 0x04, // Vendor ID
    0x39, 0x00, // Product ID 
    0x00, // LSB of firmware version
    0x03, // MSB of firmware version
    0x01, // Manufacture string index
    0x03, // Product string index
    0x00, // Serial number string index
    0x01 // Number of configurations
};

要知道需要发送哪些端点和HID数据,您可以读取HID规范,但更容易查看现有的微控制器实现。许多微控制器品牌都有关于如何用USB堆栈模拟USB鼠标的例子。下面是一些例子:

票数 4
EN

Stack Overflow用户

发布于 2017-12-29 07:46:13

HID是USB定义的标准。所以微软没有定义格式。事实上,HID是如此通用,因此格式应该由您自己在HID报表描述符中定义。

HID描述符在设备类别定义HIDHID使用表中定义。

Device Class Definition HID' there is an example of mouse which is exact what you want.使用页(通用桌面)、用法(鼠标)、集合(应用程序)、用法(指针)、集合(物理)、报表计数(3)、报表大小(1)、使用页(按钮)、使用量最小(1)、使用量最大值(3)、逻辑最小值(0)、逻辑最大值(1)、输入(数据、变量、绝对)、报表计数(1),报表大小(5)、输入(常量)、报表大小(8)、报表计数(2)、使用页(通用桌面)、使用(X)、使用率(Y)、逻辑最小值(-127)、逻辑最大值(127)、输入(数据、变量、相对)、结束集合、结束集合

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47942366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档