我有模拟键盘的 USB 条码扫描仪。连接后,X 获取控件并像普通键盘一样处理它,并将键盘事件发送到当前聚焦的窗口。
这不是我想做的。我有一个程序可以从 ascii 输入流读取条形码并处理它们。该程序在后台运行,根本没有用户界面。
如何配置 Linux 在 X 中不使用此 USB 键盘,而是将其映射为 ascii 流设备。这样,我就能够将其重定向为我的程序的输入设备,并提供条形码读取功能,无论输入焦点如何变化。并且条形码根本不应该传递到当前聚焦的窗口。
另外,最好不要以 root 身份运行条形码处理程序,因此键盘设备应该具有每个人的读取权限。
答案1
1)如何配置X忽略键盘
用于lsusb
查找条形码扫描仪的 ID(格式为0123:4567
)。创建或修改xorg.conf
文件(通常在 中/etc/X11/
)。添加包含InputClass
您刚刚找到的 ID 的部分:
Section "InputClass"
Identifier "barcode"
MatchUSBID "0123:4567"
Option "Ignore" "true"
EndSection
重新启动 X,验证Xorg.log
您的设备是否被此部分识别并忽略。
2) 从按键到 ASCII(或其他)代码的转换非常复杂,以允许不同的键盘布局、死键、自定义等。现在您禁用了 X 转换层,您可以从适当的设备接收按键和按键释放/dev/input/eventX
事件。数量可以改变;对于您的条形码阅读器,将有一个/dev/input/by-id/
不会改变的符号链接。所以使用符号链接。
您可以运行evtest
此文件以查看它生成的事件类型。它们对条形码阅读器的映射很简单,因此从 keysym 到 ASCII 代码的表查找就可以了。您可以在自己的程序中处理这些事件,查看evtest
源代码,或者例如这里。您还可以编写一个小型 C 程序,它只读取该设备并在标准输出上生成 ASCII,然后使用管道等将其集成到您的应用程序中。
“将其映射为 ASCII 流设备”是不可能的,Linux 内核中不存在此类设备。
3)设置权限
您需要编写自定义udev
规则来设置输入设备的权限。SUBSYSTEM
必须匹配input
、ACTION
必须匹配ADD
,环境ENV
应包含与设备匹配的信息(用于udevadm
查找详细信息),并且您可以为新创建的设备设置OWNER
、GROUP
和。这是一个有点笼统的MODE
/dev/input/eventX
如何,我找不到更具体的。谷歌搜索更好的教程。