在 C# 中设置 USB 键盘状态

Posted

技术标签:

【中文标题】在 C# 中设置 USB 键盘状态【英文标题】:Set USB keyboard status in C# 【发布时间】:2017-02-14 15:51:23 【问题描述】:

我需要将输出报告发送到 USB“键盘”,但 Windows 在 USB 设备上使用 CreateFile 时返回无效句柄。这是因为 Windows 以独占模式打开设备。如何仍将输出报告发送到键盘?

我已经研究过 HidP_Xxxx 函数,但它们都需要 CreateFile 以有效的句柄成功。此外,直接输入的 SendDeviceData 文档说没有设备可以使用它,而是使用 HID。该页面上指向 HID 文档的链接已损坏。

【问题讨论】:

键盘,无论是否 USB,都是输入设备,而不是输出设备。您希望如何对键盘进行任何输出?另外,代码在哪里? USB 键盘支持编写带有 LED 状态的报告。我试图与之交谈的“键盘”实际上是一个条形码扫描仪,文档说明发送 1 字节输出报告,其中 LED 状态位按特定顺序设置/清除。这是使条形码扫描仪进入正确模式所必需的。 尝试 HIDAPI:signal11.us/oss/hidapi @DavidGrayson HIDAPI 仍然需要能够使用 CreateFile 打开 USB 设备。这隐藏在 hid_open 调用中。尝试打开 USB 键盘类设备时 hid_open 将失败。见https://github.com/signal11/hidapi/issues/247 【参考方案1】:

这可能是条形码扫描仪的驱动程序(.inf 文件)及其在注册表中设置的一些特定键的问题,请参阅以下链接

http://www.cypress.com/knowledge-base-article/exclusive-access-usb-device https://msdn.microsoft.com/en-us/library/windows/hardware/ff563827(v=vs.85).aspx(指定对设备对象的独占访问) https://msdn.microsoft.com/en-us/library/windows/hardware/ff548407(v=vs.85).aspx(IoCreateDeviceSecure 例程) https://msdn.microsoft.com/windows/hardware/drivers/install/inf-addreg-directive https://msdn.microsoft.com/en-us/library/dn790026(v=vs.85).aspx(注册并初始化条码扫描器驱动) https://msdn.microsoft.com/de-de/library/windows/desktop/ee416848(v=vs.85).aspx(合作级别)

也许使用类似USBDeview 的程序来清理注册表并重新安装扫描程序(检查inf 文件中的AddReg 条目)或尝试删除独占访问 注册表项手动条码扫描器

此外,Windows 10 hidscanner.dll 似乎有问题 https://answers.microsoft.com/en-us/windows/forum/windows_10-hardware/pos-hid-barcode-scanner-drivers-being-deleted/206b5354-06e0-47cb-98b8-805f525e130e ,https://answers.microsoft.com/en-us/windows/forum/windows_10-hardware/windows-10-with-pos-hid-barcode-scanner/2adc8ea9-556c-4b85-98fe-3b625c37ab76

【讨论】:

条形码扫描仪作为 USB 键盘类设备连接到系统,并使用“无驱动”HID 设置。没有 .inf 文件可以纠正 Windows 独占访问 USB 键盘类设备的行为。对 USB 键盘类设备的独占访问被硬编码到 Windows 设备管理系统中。他们这样做是出于安全原因(即试图阻止键盘记录器打开另一个键盘的只读句柄)。

以上是关于在 C# 中设置 USB 键盘状态的主要内容,如果未能解决你的问题,请参考以下文章

在 html 文本框中设置键盘插入符号位置

如何以编程方式在系统偏好设置中设置 macOS 键盘快捷键?

键盘显示时在 UIViewController 中设置 Tableview y 位置

如何在 UIView 中设置滚动视图以向上滑动被键盘隐藏的文本字段?

为什么不要在viewDidLoad方法中设置开始监听键盘通知

WPF中设置组合键时间