如何使Linux在使键盘可供程序读取的同时忽略键盘?

问题描述

我正在构建某种信息亭系统,并且为此购买了USB USB DIY键盘:https://www.amazon.com/gp/product/B07QPXQQ7L

这使我有很多按钮,它们的行为类似于键盘按键。

我正在编写一个程序(Perl),它将从该键盘获取输入并根据该输入执行操作。

问题是我需要让系统的其余部分(X和TTY)都忽略该键盘,以便它不会在终端或窗口管理器中键入随机内容。换句话说,系统应该忽略它,但是设备本身仍然必须在/ dev / input /...

中可用。

我不需要真正的键盘来控制机器,因为我通过VNC和SSH连接。

如果您知道如何从/ dev / input / ...键盘进行读取并以与终端中的STDIN相同的方式输入字母,则奖励积分。

谢谢!

解决方法

我在这里找到了解决方案,在这种情况下,对于条形码读取器,有人想要完全一样的东西: https://serverfault.com/questions/385260/bind-usb-keyboard-exclusively-to-specific-application/976557#976557

SUBSYSTEM=="input",ACTION=="add",ATTRS{idVendor}=="xxxx",ATTRS{idProduct}=="yyyy",RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
ACTION=="add",SYMLINK+="diykeyboard"

然后用lsusb中的供应商和产品ID替换 xxxx yyyy 。因此,以我为例 1c4f 0002

Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory

udevadm control --reload的事情对我没有帮助,我不得不重新启动。

那么从理论上讲,应该在/dev/diykeyboard(SYMLINK变量)处可以使用键盘上键入的数据。

现在不幸的是,在我的情况下,有多个事件与此供应商+产品匹配,并且与正确的事件匹配,我需要在第二行中添加DEVPATH=="*:1.0/*",KERNEL=="event*",以创建SYMLINK。然后惊奇的是它没有在/ dev中创建链接,所以我不得不做点脏事,自己用ln创建一个链接:

SUBSYSTEM=="input",ATTRS{idVendor}=="1c4f",ATTRS{idProduct}=="0002",RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input",DEVPATH=="*:1.0/*",KERNEL=="event*",RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /diykeyboard'"

(不要在/ tmp中创建链接,因为udev发生在引导时/ tmp的安装之前)

从那里我可以用/diykeyboard来显示/dev/input/event0(通常指向evtest),它显示键入的密钥,或者直接用我的程序读取然后解码扫描代码。 / p>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...