You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 7(gnome-classic)下如何识别接收键鼠输入的应用/进程ID

嘿,我之前在CentOS 7的gnome-classic环境下折腾过类似的键鼠事件与目标应用关联的需求,结合你用logkeys的场景,给你几个实用的方案:

方案1:用X11命令行工具快速关联(适合脚本集成)

因为gnome-classic是基于X11的桌面环境,遵循EWMH标准,我们可以通过X11的工具获取当前聚焦窗口的信息,进而关联到对应的进程ID和应用名称。你可以把这段逻辑和logkeys的捕获流程结合起来,每次记录按键时同步记录当前活跃应用。

具体命令示例:

# 1. 获取当前活跃窗口的ID(十六进制)
ACTIVE_WINDOW=$(xprop -root _NET_ACTIVE_WINDOW | awk '{print $5}')
# 2. 根据窗口ID获取对应的进程ID(PID)
WINDOW_PID=$(xprop -id $ACTIVE_WINDOW _NET_WM_PID | awk '{print $3}')
# 3. 通过PID获取应用名称
APP_NAME=$(ps -p $WINDOW_PID -o comm=)

# 输出结果示例
echo "当前活跃应用:$APP_NAME(PID:$WINDOW_PID)"

你可以把这段脚本封装成一个函数,在logkeys的日志回调或者定时触发(比如每次按键事件后)调用,把应用信息和按键内容写到同一个日志文件里。

方案2:集成X11 API到logkeys代码中(适合自定义开发)

如果你的项目需要更高效的集成(不想频繁调用外部命令),可以直接在logkeys的C代码中加入X11的调用逻辑,实时获取当前聚焦窗口的PID。

以下是一个简化的C函数示例,用来获取当前活跃窗口的PID:

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdlib.h>

pid_t get_active_app_pid() {
    // 连接到当前X11显示
    Display *display = XOpenDisplay(NULL);
    if (!display) {
        return -1;
    }

    Window root_win = DefaultRootWindow(display);
    Window active_win;
    int revert_mode;
    // 获取当前聚焦的窗口
    XGetInputFocus(display, &active_win, &revert_mode);

    // 获取_NET_WM_PID这个原子属性(EWMH标准定义的窗口PID属性)
    Atom net_wm_pid = XInternAtom(display, "_NET_WM_PID", False);
    Atom prop_type;
    int prop_format;
    unsigned long prop_items, prop_bytes;
    unsigned char *pid_buffer = NULL;

    // 读取窗口的PID属性
    int status = XGetWindowProperty(display, active_win, net_wm_pid,
                                    0, 1, False, XA_CARDINAL,
                                    &prop_type, &prop_format,
                                    &prop_items, &prop_bytes, &pid_buffer);

    pid_t pid = -1;
    if (status == Success && pid_buffer && prop_items > 0) {
        pid = *((pid_t *)pid_buffer);
    }

    // 释放资源
    XFree(pid_buffer);
    XCloseDisplay(display);
    return pid;
}

你可以在logkeys捕获到按键事件的代码位置调用这个函数,拿到PID后再通过proc文件系统(比如/proc/<PID>/comm)读取应用名称,这样就能把按键信息和目标应用直接关联起来。

关键注意事项

  • 权限配置:运行logkeys的用户需要加入input组以读取输入设备:sudo usermod -aG input <你的用户名>;同时确保DISPLAY环境变量正确设置(比如export DISPLAY=:0),否则无法访问X11窗口信息
  • 兼容性验证:gnome-classic遵循EWMH标准,_NET_ACTIVE_WINDOW和_NET_WM_PID属性是原生支持的,无需额外配置
  • 后台运行适配:如果程序在后台启动,必须手动指定DISPLAY变量,否则X11相关工具和API会连接失败

内容的提问来源于stack exchange,提问作者Nikhil Nilawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:54