如何防止键盘被当前应用程序解释?

如何防止键盘被当前应用程序解释?

我有 3 个 USB 键盘连接到 Linux。通常,当在任何一个上书写时,字符“前往”当前活动的应用程序,例如终端或任何其他应用程序。

/dev/input/eventX但是,我通过使用某些设备读取特定设备来直接从两个键盘读取键盘事件Perl模块。当脚本正确读取和解码所有事件时,输入的键也会进入活动应用程序。

问题是:是否可以停止将键盘事件从特定键盘路由到活动应用程序?例如,告诉内核来自特定键盘的输入不应被视为普通键盘输入。

因为X11从每个具有设备节点的设备读取数据,看起来/dev/input/event*有两种可能的解决方案:

  1. 将 USB“键盘”的名称更改为另一个名称eventN,而不是例如/dev/input/myinput0。不幸的是,udev规则不允许重命名设备。 (该NAME指令rules.d仅适用于网络设备,其他设备只能创建符号链接)

  2. 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 是我立即知道的方法。

相关内容