我购买了一个 USB 数字键盘,它的功能似乎与普通 USB 键盘相同,但只有数字键盘键和 LED。它在 Linux 下正常工作,我可以用它和我的实际键盘输入数字。我想编写一个可以直接与其交互的应用程序(响应击键并控制 LED),而不必有一个窗口,并防止其他应用程序响应它。我该怎么做呢?
2 回答
好吧,伊格纳西奥的评论确实帮助我指出了正确的方向。我需要从 gdk_display_get_default() 获取显示,然后使用 gdk_display_get_device_manager(),使用 gdk_device_manager_list_devices() 找到设备,最后使用 gdk_device_grab() 抓取它。(或者,如果我真的想要的话,我可以直接使用 X API……)这让我可以将键盘的事件定向到我的窗口,而不管焦点如何。
我遇到的一个障碍是窗口必须是“可见的”才能接收事件——而不是隐藏、最小化或在不同的工作区。我能做的最好的隐藏它是让它 1x1 像素未装饰并将它贴在屏幕外的某个地方(尽管有些 WM 不会让它真正离开屏幕,因此尺寸也很小)。
查看事件设备接口/dev/input
。
一个不错的 Python 接口是http://pythonhosted.org/evdev/
更多信息:
使用输入子系统,第二部分
Linux 期刊,第 107 期,2003 年 3 月
http://www.linuxjournal.com/article/6429
我正在做一个类似的项目,可能会使用 evdev 来捕获键盘事件,但 XTest(在 Xlib 层中)会生成虚拟键盘事件。
由于/dev/input
低于 X,因此不需要聚焦/显示窗口。
更新(2014 年 1 月 17 日):
这是一种完全不同的方法,通过命令行。
1) 使用 列出可用的输入设备(及其 ID)xinput --list
。
2) 用 .“浮动”目标输入设备xinput --float <device_id>
。浮动设备后,它生成的输入事件将不再被任何正在运行的应用程序听到。因此,在测试/开发期间,您可能希望插入两个键盘(和/或鼠标),一个浮动,另一个连接。(您可以使用 重新连接浮动设备xinput --reattach <device_id> <master_id>
。)
3)设备浮动后,您可以通过运行“查看”它生成的事件xinput --test <device_id>
。
您可以查看 xinput 的源代码以了解这是如何在 C 中完成的。
http://anonscm.debian.org/gitweb/?p=pkg-xorg/app/xinput.git;a=tree