linux - 获取最顶层窗口的 pid 和详细信息

标签 linux qt pid xlib

有谁知道如何获取顶部事件窗口的PID,然后如何使用PID获取窗口的属性?我指的是进程名称、程序名称等属性。

我在 Linux (Ubuntu 9.10) 下使用 Qt。

最佳答案

linux 中有一个名为 xprop 的命令,它是一个用于在 X 服务器中显示窗口属性的实用程序。在 linux 中,xprop -root 为您提供根窗口属性以及其他事件程序。然后您可以使用此命令获取事件窗口的 ID:

xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)

获取事件窗口 ID(行首没有“_NET_ACTIVE_WINDOW(WINDOW): window id #”),请使用此命令:

xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'

现在您可以将此命令输出保存在用户定义的变量中:

myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'

xprop 有一个属性 call -id。此参数允许用户在命令行上选择窗口 ID。我们应该在输出中寻找 _NET_WM_PID(CARDINAL) ...所以我们使用这个命令:

xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'

这会为您提供最顶层的事件窗口进程 ID。

变得更狡猾,只需 1 个命令即可完成所有事情......:

 xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'

现在我可以使用 popen 函数通过我的 C++ 程序(在 linux 中)运行这些命令,获取标准输出并打印或保存它。 popen 创建一个管道,以便我们可以读取正在调用的程序的输出。

(您还可以使用 '/proc' 文件系统并获取 PID 的更多详细信息('/proc/YOUR_PID/status'))

#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;

inline std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
                result += buffer;
    }
    pclose(pipe);
    return result;
}

int main()
{
    //we uses \\ instead of \ ( \ is a escape character ) in this string
 cout << exec("xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\\(WINDOW\\)/{print $NF}') | awk '/_NET_WM_PID\\(CARDINAL\\)/{print $NF}'").c_str(); 
 return 0;
}

关于linux - 获取最顶层窗口的 pid 和详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041532/

相关文章:

c++ - Qt Creator 在 linux mint 64 位中找不到 CMAKE_CXX_COMPILER 编译器

ruby - Unicorn 在部署后定期无法重新启动 - PID 过时

shell - 检查PID是否僵化的可移植shell解决方案

linux - 在 BASH 中截断输出

linux - SVN: 删除 repo 子目录

qt - 如何使Qt了解QMYSQL驱动程序

c++ - 我如何使用 QProcess 的队列?

c - 每次执行 a.out 时,getpid() 递增 5 或 6

c - 函数声明不是原型(prototype)

php - 从 php 执行的 Shell 脚本,但 sh 脚本中的命令不会运行