我正在做一个 linux 项目。我被困在我需要知道哪个应用程序/进程 ID 正在接收键盘/鼠标输入的点上。我的意思是绑定必须存储在某个地方。有人可以帮帮我吗?编辑 1:我正在开发一个键盘/鼠标事件捕获项目。我发现 logkeys(项目)很有用。我需要找到用户输入的应用程序名称以及按下的键编辑 2:我使用的是 CentOS 7。XDG_SESSION_DESKTOP = gnome-classic。GDMSESSION = 侏儒经典。
2 回答
linux 内核负责接收来自物理键盘或鼠标的事件,而不是任何特定的应用程序。然后将事件传递给活动应用程序。所以在内核源代码中寻找键盘和鼠标的驱动程序。
我需要知道哪个应用程序/进程 ID 正在接收键盘/鼠标输入。
实际上,在 Linux 台式机(或笔记本电脑)上,如果您想到物理键盘和鼠标,这并不重要(请参阅下面的原因)。
在 Linux 服务器上,您通常没有任何物理键盘。
在某个物理人使用的 Linux 台式机或笔记本电脑上,您通常有一些用于图形桌面环境的显示服务器(例如Xorg或Wayland ) (除非您使用没有任何GUI的虚拟控制台)。该显示服务器正在处理(并从中读取)物理键盘和鼠标,因此(实际上)是从它们读取的唯一进程。检查lsof(8)。
当然,显示服务器正在处理物理键盘和鼠标事件,并将它们制作成发送到某些客户端和窗口的更高级别的消息(在某些窗口管理器的帮助下,并管理焦点)。但这是如何发生的则是一个不同的问题(在 Xorg 和 Wayland 中是非常不同的)。另请阅读有关合成窗口管理器的信息。BTW Xorg 客户端可能在远程机器上运行。
一台 Linux 机器可以管理多个座位,即屏幕+键盘+鼠标的几种组合,每个组合由不同的物理人使用。然后你可以有几个显示服务器。
您可能会花费数月或数年的时间来研究X11 协议和体系结构。文档很重:数千页(另请参阅ICCCM和EWMH)。如果需要,您还将花费数月时间研究 Wayland 协议。
您的项目可能需要多年的工作(甚至一生)。累积的软件层(显示服务器、GUI 工具包、窗口管理器等)非常庞大,有数千万行源代码。
另请参阅this answer to a very similar question,以及
如果你用gnome-classic
你的显示服务器肯定是Xorg。所以 ICCCM & EWMH 适用。那么您可能会对获得X11 焦点窗口的常用技术感兴趣_NET_WM_PID
并结合使用。您可能会考虑修补通常的窗口管理器(并且您可能仍然需要阅读更多有关 X11 的内容才能编写一些健壮的实现)。WM_CLIENT_MACHINE
不要忘记许多 X11 客户端应用程序正在打开几个顶级 X11 窗口,并且一些 X11 客户端应用程序正在使用多个 X11 显示器,因此有几个 Xorg 显示服务器。