【问题标题】:on Linux, how do I find out which application/processid is receiving keyboard/mouse input?在 Linux 上,我如何找出哪个应用程序/进程 ID 正在接收键盘/鼠标输入?
【发布时间】:2018-05-16 04:58:00
【问题描述】:

我正在开发一个 linux 项目。我被困在我需要知道哪个应用程序/进程 ID 正在接收键盘/鼠标输入的点上。我的意思是绑定必须存储在某个地方。有人可以帮帮我吗? 编辑 1:我正在开发一个键盘/鼠标事件捕获项目。我发现 logkeys(项目)很有用。我需要找到用户正在输入的应用程序名称以及按下的键 编辑 2:我使用的是 CentOS 7。XDG_SESSION_DESKTOP = gnome-classic。 GDMSESSION = 侏儒经典。

【问题讨论】:

  • @DavidC.Rankin tty 仅在输入进入终端窗口时有效。我需要一些广泛的东西。即使我正在向 chrome 或 excel 应用程序提供输入,这也是有效的。
  • chromeexcell 将在“桌面”下运行,“焦点模型”将确定哪个“窗口”正在接收键盘输入。桌面将实现一个“虚拟键盘”,它会将键盘 tty 绑定到它(通常是/dev/console),但除此之外,它将由窗口管理器和桌面来指导输入到适当的窗口/进程。希望其他人可以对其进行扩展——但您需要描述您正在使用的桌面。您可以启动 xev 来查看 X-input 处理程序。
  • 为什么这些信息很重要?
  • @NikhilNilawar:不要评论您自己的问题,而是编辑您的问题以改进它

标签: linux keyboard-input


【解决方案1】:

Linux 内核负责从物理键盘或鼠标而不是任何特定应用程序接收事件。然后将事件传递给活动应用程序。所以在内核源代码中寻找键盘和鼠标的驱动程序。

【讨论】:

    【解决方案2】:

    我需要知道哪个应用程序/进程 ID 正在接收键盘/鼠标输入。

    实际上,在 Linux 台式机(或笔记本电脑)上,这并不重要(请参阅下面的原因),如果您想到 物理 键盘和鼠标。

    在 Linux 服务器上,您通常没有任何物理键盘。

    在某个物理人使用的 Linux 台式机或笔记本电脑上,您通常有一些 display server(例如 XorgWayland)用于图形 desktop environment(除非您使用 virtual consoles 而没有任何 GUI )。该显示服务器正在处理(并从中读取)物理键盘和鼠标,因此(实际上)是从它们读取的唯一进程。请与lsof(8)联系。

    当然,显示服务器正在处理物理键盘和鼠标事件,并从中制作更高级别的消息发送到一些clientwindow(在一些window manager 的帮助下,并管理@ 987654331@)。但这是如何发生的则是一个不同的问题(在 Xorg 和 Wayland 中是非常不同的)。另请阅读compositing window managers。顺便说一句,Xorg 客户端可能在远程机器上运行。

    一台 Linux 机器可以管理多个seats,即屏幕+键盘+鼠标的多个组合,每个组合由不同的物理人使用。那么你可以有几个显示服务器。

    您可以花费数月或数年的时间学习 X11 protocols and architecture。文档很重:数千页(另请参阅ICCCMEWMH)。如果需要,您还将花费数月时间研究 Wayland 协议。

    您可能需要多年的工作(甚至一生)您的项目。累积的软件层(显示服务器、GUI 工具包、窗口管理器等)非常庞大,有数千万行源代码。

    另请参阅this 对一个非常相似的问题的回答,以及this


    如果您使用gnome-classic,您的显示服务器肯定是Xorg。所以 ICCCM & EWMH 适用。那么您可能会对_NET_WM_PIDWM_CLIENT_MACHINE 以及get X11 焦点窗口的常用技术感兴趣。您可以考虑修补通常的窗口管理器(并且您可能仍然需要阅读更多有关 X11 的信息才能编写一些健壮的实现)。

    不要忘记,许多 X11 客户端应用程序正在打开几个顶级 X11 窗口,并且一些 X11 客户端应用程序正在使用多个 X11 显示器,因此有多个 Xorg 显示服务器。

    【讨论】:

    • 但从技术上讲,我认为一个应用程序(我不确定那里可能是 X,或者在控制台中一些伪 tty?)打开一个设备并从(分别为 selects 上)读取它。这将是技术上直截了当的答案。我不是很肯定——可以打开多个进程并读取,例如在任何给定时间从鼠标设备?是否可以看到打开设备的进程(我应该这么认为)?
    • 可能有多个进程读取鼠标,但实际上是没有用的。只有显示服务器在读取鼠标
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多