在Windows下,有没有办法手动将消息发送到USB键盘? [英] Is there a way to manually send messages to a USB keyboard, under Windows?

查看:38
本文介绍了在Windows下,有没有办法手动将消息发送到USB键盘?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

阅读OS Dev's HID specifications以及Stack上的几个问题后,我注意到我的MCU可以检测到,在我的机器上没有运行其他软件的情况下,何时按下Caps Lock(想必对所有其他"LED键"都有效)。因此,当我按下Caps Lock时,LED会打开我的MCU。

要设置LED灯,驱动程序使用标准USB设置事务向设备发送SetReport请求,并带有一个字节的数据阶段。安装程序包的请求类型应包含0x21,SetReport的请求代码为0x09。设置包的值字段在低位字节中包含报告ID,应为零。高位字节包含报告类型,应为0x02,表示输出报告或从软件发送到硬件的报告。索引字段应包含USB键盘的接口编号,该编号出现在接口描述符中,表示该设备根本就是USB键盘。数据阶段应该是1个字节,这是一个位字段。此设置事务应传输到控制端点0,这将在所有硬件上工作。其他硬件可能支持也可能不支持可选的中断输出端点。如果硬件支持中断输出端点,则只需将1字节的数据阶段传输到中断输出端点,而不会产生设置阶段和状态阶段的额外开销。如果硬件支持中断输出端点,则应尽可能避开控制端点,因为中断输出端点速度更快,并且可以使用中断传输而不是设置传输进行编程。1字节数据阶段(用于设置事务)或1字节中断输出传输的格式如下所示。当位设置为1时,相应的LED亮起。

我想知道是否有可能手动向MCU发送消息,就像闪烁LED一样,但包含我自己的内容。 如有任何帮助,我们将不胜感激。

推荐答案

您可以使用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键盘?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆