有人知道如何获取顶部活动窗口的PID,然后如何使用PID获取窗口的属性吗?我指的是进程名、程序名等属性。
我在Linux (Ubuntu 9.10)下使用Qt。
发布于 2010-01-13 04:51:03
linux中有一个调用xprop的命令,它是一个用于在X服务器中显示窗口属性的实用程序。在linux中,xprop -root为你提供了根窗口属性和其他活动程序。然后,您可以使用以下命令获取活动窗口的ID:
xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)要获得窗口,只需使用活动窗口ID (在行首不使用“_NET_ACTIVE_WINDOW():window id #”),请使用以下命令:
xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'现在,您可以将此命令输出保存在用户定义的变量中:
myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'xprop有一个名为-id的属性。此参数允许用户在命令行上选择窗口id。我们应该在输出中查找_NET_WM_PID(基数) ...所以我们使用这个命令:
xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'这将为您提供最顶层的活动窗口进程ID。
为了更巧妙,只用一条命令就能做所有的事情...:
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') )
#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;
}发布于 2010-01-12 00:51:21
关于X的一件事是它是网络透明的。在顶部显示的实际窗口(具有焦点)很可能是在您自己的计算机之外的计算机上运行的,在这种情况下,在窗口中运行的进程的进程id在您的计算机上没有任何意义。
你能详细说明一下你想做什么吗?我认为这里有一些缺失的细节。理想情况下,您应该在X级别上工作,而不是在机器特定的级别上工作。
发布于 2010-01-11 19:48:37
窗口所有者的PID存储在X属性_NET_WM_PID中。请注意,这只是一个事实上的标准。
你必须先找到窗口的id,然后才能查询属性。我不知道QT为此提供了任何抽象,因此您可能必须使用xlib或xcb。
为初学者试用工具xprop。
https://stackoverflow.com/questions/2041532
复制相似问题