首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最上面窗口的pid和详细信息

问获取最上面窗口的pid和详细信息
EN

Stack Overflow用户
提问于 2010-01-11 19:40:31
回答 9查看 18.6K关注 0票数 19

有人知道如何获取顶部活动窗口的PID,然后如何使用PID获取窗口的属性吗?我指的是进程名、程序名等属性。

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

EN

回答 9

Stack Overflow用户

发布于 2010-01-13 04:51:03

linux中有一个调用xprop的命令,它是一个用于在X服务器中显示窗口属性的实用程序。在linux中,xprop -root为你提供了根窗口属性和其他活动程序。然后,您可以使用以下命令获取活动窗口的ID:

代码语言:javascript
复制
xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)

要获得窗口,只需使用活动窗口ID (在行首不使用“_NET_ACTIVE_WINDOW():window id #”),请使用以下命令:

代码语言:javascript
复制
xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'

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

代码语言:javascript
复制
myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'

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

代码语言:javascript
复制
xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'

这将为您提供最顶层的活动窗口进程ID。

为了更巧妙,只用一条命令就能做所有的事情...:

代码语言:javascript
复制
 xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'

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

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

代码语言:javascript
复制
#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;
}
票数 25
EN

Stack Overflow用户

发布于 2010-01-12 00:51:21

关于X的一件事是它是网络透明的。在顶部显示的实际窗口(具有焦点)很可能是在您自己的计算机之外的计算机上运行的,在这种情况下,在窗口中运行的进程的进程id在您的计算机上没有任何意义。

你能详细说明一下你想做什么吗?我认为这里有一些缺失的细节。理想情况下,您应该在X级别上工作,而不是在机器特定的级别上工作。

票数 19
EN

Stack Overflow用户

发布于 2010-01-11 19:48:37

窗口所有者的PID存储在X属性_NET_WM_PID中。请注意,这只是一个事实上的标准。

你必须先找到窗口的id,然后才能查询属性。我不知道QT为此提供了任何抽象,因此您可能必须使用xlib或xcb。

为初学者试用工具xprop。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2041532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档