4

我购买了一个 USB 数字键盘,它的功能似乎与普通 USB 键盘相同,但只有数字键盘键和 LED。它在 Linux 下正常工作,我可以用它和我的实际键盘输入数字。我想编写一个可以直接与其交互的应用程序(响应击键并控制 LED),而不必有一个窗口,并防止其他应用程序响应它。我该怎么做呢?

4

2 回答 2

1

好吧,伊格纳西奥的评论确实帮助我指出了正确的方向。我需要从 gdk_display_get_default() 获取显示,然后使用 gdk_display_get_device_manager(),使用 gdk_device_manager_list_devices() 找到设备,最后使用 gdk_device_grab() 抓取它。(或者,如果我真的想要的话,我可以直接使用 X API……)这让我可以将键盘的事件定向到我的窗口,而不管焦点如何。

我遇到的一个障碍是窗口必须是“可见的”才能接收事件——而不是隐藏、最小化或在不同的工作区。我能做的最好的隐藏它是让它 1x1 像素未装饰并将它贴在屏幕外的某个地方(尽管有些 WM 不会让它真正离开屏幕,因此尺寸也很小)。

于 2013-02-25T23:56:35.757 回答
0

查看事件设备接口/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

于 2014-01-15T17:57:13.780 回答