获得最顶层窗口的pid和细节

有谁知道如何获得顶部活动窗口的PID,然后如何使用PID获得窗口的属性? 我的意思是像进程名称,程序名称等属性

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

在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有一个属性调用-id。 该参数允许用户在命令行上选择窗口ID。 我们应该在输出中寻找_NET_WM_PID(CARDINAL)…所以我们使用这个命令:

 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函数来运行这些命令,抓取stdout并打印或保存。 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; } 

关于X的一点是它是网络透明的。 显示在顶部(有焦点)的实际窗口很有可能在自己以外的机器上运行,在这种情况下,在窗口内运行的进程的进程ID在你的机器上是没有意义的。

你能详细说一下你想做什么吗? 我想这里有一些遗漏的细节。 理想的情况下,你应该在X级而不是在机器上工作。

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

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

玩起动器的工具xprop

xlib的XGetInputFocus会告诉你哪个窗口有焦点,这比最顶层的可能更有趣。 参看 Xfree86的XGetInputFocus手册页 。

如果它真的是最顶层的窗口,而不是你关注的窗口,那么我不认为有一个简单的调用来做到这一点,因为xlib似乎没有提供任何查询全局的方法堆栈顺序,这是数据结构,告诉你哪些窗口在其他人面前。

一旦你有正确的窗口ID, xprop会列出_NET_WM_PID_下的pid – 虽然不是所有的窗口都有这样的属性…

后记更多的想法; 很长一段时间,因为我已经想过xlib

总结:

  1. X不提供窗口标识符和pid之间的任何可靠关联,正如Noufal所观察到的,在X桌面上服务的窗口可能来自许多不同的机器,并且两个远程客户机可能碰巧使用相同的PID,因为它只是唯一的机。 参看 如何从进程ID获取X11窗口?

  2. X似乎没有提供一个界面,询问哪个是最上面的窗口,或者是否有一个窗口被另一个窗口遮住。 同样有特权的访问… 如何识别使用xlib的顶级X11窗口?

  3. 通常可用的窗口管理器和Qt不会授予您对X的特权访问权限

  4. 如果没有找到最顶层窗口的方法,以及窗口ID与匹配的pid的可靠关联,我们不能解决问题。

  5. 我们可以找到哪个窗口有重点,这可能是我们想要的。 但是,没有wid的pid映射…

所以,对不起,看起来不能做。

晚会非常晚,但我也有类似的问题,我认为这可以帮助有同样问题的其他人。 有一个命令行技巧来做到这一点,你可以尝试执行它,或者执行它将输出重定向到你的代码

 xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME WM_CLASS 

给出窗口名称,以及程序名称。 例如,对于这个标签,它给了我

 _NET_WM_NAME(UTF8_STRING) = "linux - Getting pid and details for topmost window - Stack Overflow - Mozilla Firefox" WM_CLASS(STRING) = "Navigator", "Firefox" 

我正在投票Michel Kogan的答案 ,并加上这个简要的总结:

 ps -o pid,comm,args $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") -f _NET_WM_PID 0c " \$0\\n" _NET_WM_PID | awk "{print \$2}") 

以上将显示当前活动窗口的以下内容:PID,命令名称(仅可执行文件名称),命令及其所有参数。

安装wmctrl(从存储库)。 wmctrl -lp可能是你想要的。 如果您的程序需要,可以随时查看源代码。

将xprop的要点提取到https://github.com/mondalaci/current-window-linux

工作,但有时段故障 – 需要修复和清理。