![如何防止键盘被当前应用程序解释?](https://linux22.com/image/113581/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E9%94%AE%E7%9B%98%E8%A2%AB%E5%BD%93%E5%89%8D%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%A7%A3%E9%87%8A%EF%BC%9F.png)
我有 3 个 USB 键盘连接到 Linux。通常,当在任何一个上书写时,字符“前往”当前活动的应用程序,例如终端或任何其他应用程序。
/dev/input/eventX
但是,我通过使用某些设备读取特定设备来直接从两个键盘读取键盘事件Perl模块。当脚本正确读取和解码所有事件时,输入的键也会进入活动应用程序。
问题是:是否可以停止将键盘事件从特定键盘路由到活动应用程序?例如,告诉内核来自特定键盘的输入不应被视为普通键盘输入。
因为X11
从每个具有设备节点的设备读取数据,看起来/dev/input/event*
有两种可能的解决方案:
将 USB“键盘”的名称更改为另一个名称
eventN
,而不是例如/dev/input/myinput0
。不幸的是,udev
规则不允许重命名设备。 (该NAME
指令rules.d
仅适用于网络设备,其他设备只能创建符号链接)X11
在某种程度上更改配置,/usr/share/X11/xorg.conf.d/10-evdev.conf
以忽略某些特定的“类似键盘”的设备 - 例如,不要读取每个eventN
设备。目前在我的系统中它包含:
Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
您知道如何执行上述任一操作吗?
真实背景:我连接了两个 USB-RFID 读取器。它们充当键盘,例如,当我用 RFID 标签触摸阅读器时,它会发送与在键盘上键入的完全相同的 RFID 号码,例如,阅读器就像普通键盘一样。
我的应用程序可以读取 RFID 事件(在后台),并且(当然)我不想将 RFID 中的字符放入活动窗口中。
答案1
如果您无论如何都在阅读/dev/input/eventX
,只需EVIOCGRAB
对其进行 ioctl 即可。您可以在以下位置发出 ioctl珀尔容易地。当程序退出时,不要忘记释放抓取。
抓取将阻止所有其他设备(包括 X)从此设备读取事件。
这比 更干净xinput
,因为您还排除了可能想要直接从设备读取的其他应用程序,并且您还可以控制排除的持续时间(只要您的应用程序运行)。
答案2
您可以使用以下xinput
命令禁用 X 下的输入设备。运行xinput list
以列出可用设备,然后xinput disable …
按名称或编号禁用设备。
Udev 可能是可行的方法,但 X11 是我立即知道的方法。