Linux:直接与USB键盘连接

我已经购买了一个USB数字键盘,它的function与普通的USB键盘相同,但只有数字键盘和指示灯。 它在Linux下正常工作,我可以键入数字,以及我的实际键盘。 我想写一个应用程序,它可以直接连接到应用程序(响应按键和控制LED),而不必有一个窗口,并防止其他应用程序响应它。 我该怎么做呢?

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

我遇到的一个问题是窗口必须“可见”才能接收事件 – 而不是隐藏,最小化或在不同的工作空间上。 我能做的最好的办法就是把它放在一个1×1像素的地方,然后把它贴在屏幕的某个地方(尽管有些WMs不会让它实际上离开屏幕,所以尺寸也很小)。

检查事件设备接口/dev/input

一个很好的Python接口是http://pythonhosted.org/evdev/

更多信息:
使用输入子系统,第二部分
Linux Journal,Issue#107,2003年3月
http://www.linuxjournal.com/article/6429

我正在做一个类似的项目,可能会使用evdev来捕获键盘事件,但XTest(在Xlib层)来生成虚拟键盘事件。

由于/dev/input在X以下,所以不需要重点/显示一个窗口。

更新(2014年1月17日):

这是一个完全不同的方法,通过命令行。

1)用xinput --list列出可用的输入设备(及其ID)。

2)用xinput --float <device_id> “浮动”目标输入设备。 在浮动设备之后,它生成的输入事件将不再被任何正在运行的应用程序听到。 所以在测试/开发期间,您可能需要插入两个键盘(和/或鼠标),一个浮动,另一个连接。 (您可以使用xinput --reattach <device_id> <master_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