有没有办法在 Windows 下手动向 USB 键盘发送消息?

Posted

技术标签:

【中文标题】有没有办法在 Windows 下手动向 USB 键盘发送消息?【英文标题】:Is there a way to manually send messages to a USB keyboard, under Windows? 【发布时间】:2020-03-06 07:31:07 【问题描述】:

我正在从事一个涉及 MCU - Windows 通信的个人项目。 MCU 配置为充当 HID 键盘(无串行通信)。

在阅读OS Dev's HID specifications 以及 Stack 上的几个问题后,我注意到我的 MCU 可以检测到,当我的机器上没有运行任何姊妹软件时,按下大写锁定(大概适用于所有其他“led钥匙”)。所以当我按下 Caps Lock 时,一个 LED 会打开我的 MCU。

为了设置 LED 灯,驱动程序使用标准 USB 设置事务向设备发送一个 SetReport 请求,其中包含一个字节的数据阶段。设置包的请求类型应为 0x21,SetReport 的请求代码为 0x09。建立数据包的 value 字段在低字节中包含报告 ID,应为零。高字节包含报告类型,应为 0x02 表示输出报告,或从软件发送到硬件的报告。索引字段应包含 USB 键盘的接口编号,即接口描述符中的编号,表明该设备完全是 USB 键盘。数据阶段应该是 1 个字节,这是一个位域。这个设置事务应该被转移到控制端点零,它可以在所有硬件上工作。其他硬件可能支持也可能不支持可选的中断 OUT 端点。如果硬件支持中断 OUT 端点,您只需将 1 字节的数据阶段传输到中断 OUT 端点,而无需额外的 SETUP 阶段和 STATUS 阶段的开销。如果硬件支持中断 OUT 端点,则应尽可能避免使用控制端点,因为中断 OUT 端点更快,并且可以使用中断传输而不是设置传输进行编程。 1 字节数据阶段(用于 SETUP 事务)或 1 字节中断 OUT 传输的格式如下所示。当某个位设置为 1 时,对应的 LED 会亮起。

我想知道是否可以手动向 MCU 发送消息,就像闪烁 LED 作品一样,但使用我自己的内容。 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用SendInput 切换大写锁定(或数字锁定)状态,如下所示:

INPUT inputs[2] = ;

const WORD wScanCodeCapsLock = 0x3a;
const WORD wScanCodeNumLock = 0x45;

inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = wScanCodeCapsLock;
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE;
inputs[0].ki.time = 1;

inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wScan = wScanCodeCapsLock;
inputs[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
inputs[1].ki.time = 100;
SendInput(2, inputs, sizeof(INPUT));

Check this answer out here 了解如何检测这些键的当前状态。

【讨论】:

是的。我确实做到了。如果我可以使用驱动程序向键盘发送自定义消息,我正在徘徊。

以上是关于有没有办法在 Windows 下手动向 USB 键盘发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法保存 USB 设备,以便在重新插入后可以防止重新枚举?

由于该设备有问题,Windows 已将其停止. (代码 43)

有没有办法在BBB和仅通过USB线连接的PC之间使用TCP / IP通信?

怎样修复usb驱动问题

Windows 下 Quartus 检测不到 USB-Blaster 终极解决办法

windows2003 IIS6.0右键属性没有asp.net选项卡的解决办法