Linux键盘事件捕获 /dev/inputX

16

我正在尝试捕获键盘事件。 例如,我想从头开始编写一个键盘记录器。 经过2小时的奋斗,我找到了以下内容

neel@pc1$ ls -l /dev/input/by-id
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-kbd -> ../event1
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-mouse -> ../event2
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-mouse -> ../mouse1

但是当我尝试时

neel@pc1$ sudo cat /dev/input/usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-kbd

没有任何输出

经过更多搜索后,我想可能是Xorg中的某些东西阻止了它。

那么还有更多信息吗?最后怎样从那个文件中读取输入?或者还有其他方式可以捕获键盘事件吗?

6个回答

15

/proc/bus/input/devices 文件上进行简单的 grep 操作将返回连接到计算机上的所有键盘:

 grep -E  'Handlers|EV=' /proc/bus/input/devices | \
 grep -B1 'EV=120013' | \
 grep -Eo 'event[0-9]+'

其中EV=120013是设备支持的事件的位掩码。如此处所述。

这是在logkeys中实现的方式。


太棒了。它为我返回了 event2,我能够在那里看到传输的数据。 - sudo

15

你好,

我最近也在尝试完成类似的事情。

可以看一下 logkeys 项目:

http://code.google.com/p/logkeys/

如果你下载了源代码,并查看 logkeys.cc 文件,你会找到一种方法来自动检测哪个 /dev/input/event 被键盘使用。这将让你读取从键盘传输的原始扫描码,无论当前有哪个程序聚焦。logkeys 程序还展示了如何将扫描码转换为字符和其他有用的技巧。

希望这能帮到你,

Markus。


1
虽然这篇帖子很旧,但我想找相关的内容。如果连接了两个键盘,如何知道输入来自哪里?简而言之,我想在按下任何键时打印sourceId?有什么线索吗? - r4jiv007

10

你正在读取错误的设备。要么尝试所有的 /dev/input/event* ,要么查看 /var/log/Xorg.0.log 以了解哪个设备用于你的键盘。


我的 Fedora 系统中键盘的设备路径是 /dev/input/event4。 - zdav
键盘是 /dev/input/event3,也作为 /dev/input/by-path/platform-i8042-serio-0-event-kbd 符号链接在 Ubuntu(9.10)上。 - phoenix24
1
已经测试了所有6个事件文件。 只有event5有响应并在蜂鸣器上写一些东西。 后来我发现它的扬声器。然而,你可能没有注意到。我正在使用USB键盘 !!!!!-- 编辑 -- (**) Plus More Enterprise LTD. USB-compliant keyboard: Device: "/dev/input/event2"但是在 sudo cat /dev/input/event2 中没有输出。 - Neel Basu

10

我建议使用evtest应用程序,它列出所有输入设备并允许您监视它们的事件。


5

感谢您提供的关于ls -l /dev/input/by-id的提示,这对我非常有帮助!

defenderdz@defenderdz-pc:~$ ls -l /dev/input/by-id | grep kbd
lrwxrwxrwx 1 root root  9 nov.  28 14:04 usb-Logitech_USB_Receiver-event-kbd -> ../event7
lrwxrwxrwx 1 root root 10 nov.  29 00:33 usb-NOVATEK_USB_Keyboard-event-kbd -> ../event26
lrwxrwxrwx 1 root root  9 nov.  28 14:04 usb-SONiX_USB_DEVICE-event-kbd -> ../event3
defenderdz@defenderdz-pc:~$ 

'kbd' 是键盘设备的后缀(我连接了3个键盘)。

你犯了错误,因为你正在访问 错误的文件夹

/dev/input/ 而不是 /dev/input/by-id

在我的示例中,正确的路径是:

defenderdz@defenderdz-pc:~$ sudo cat /dev/input/by-id/usb-NOVATEK_USB_Keyboard-event-kbd
���]�I���]�I���]�Ia���]�b���]�b���]�b���]�����]�����]��s���]����]����]����]�>
���]�>
 ���]�>
d���]�8
       ���]�8
              ���]�8
                    ���]�����]�����]��s���]H|���]H|���]H|���]�����]�� ���]��d���]Ǵ���]Ǵ ���]Ǵ

在您的情况下
neel@pc1$ sudo cat /dev/input/by-id/usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-kbd

我并不是说这是最好的解决方案,但对我来说它很好用。 你甚至可以通过解析ls结果创建一个键盘的自动检测...


啊哈,那就是个愚蠢的错误。这是一个九年前的帖子了,我已经不记得当时在尝试做什么了。感谢你指出来。 - Neel Basu
1
哈哈哈,我知道,这更多是为那些将面临此问题的人(像我一样)准备的,很高兴看到你仍然活跃在论坛上^^。 - DzDev

0

对于来这里寻找调试键盘问题的人:尝试使用终端命令xev。它会显示您的外围设备(键盘和鼠标)发出的所有输入事件。这也可能对构建键盘记录器有用。


1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - MD. RAKIB HASAN
在我的测试中,它没有捕获除应用程序本身创建的窗口之外的Windows键盘事件(文档说它应该这样做)。 - Claudio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接