Mic*_*kan 24
linux中有一个命令调用xprop,它是一个用于在X服务器中显示窗口属性的实用程序.在linux中xprop -root为您提供根窗口属性以及其他活动程序.然后您可以使用以下命令获取活动窗口的ID:
xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)
Run Code Online (Sandbox Code Playgroud)
拿到刚刚激活的窗口ID(没有"_NET_ACTIVE_WINDOW(窗口):窗口编号"在该行的开头)使用这个命令:
xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
Run Code Online (Sandbox Code Playgroud)
现在您可以将此命令输出保存在用户定义的变量中:
myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
Run Code Online (Sandbox Code Playgroud)
xprop有一个属性call -id.此参数允许用户在命令行上选择窗口ID.我们应该在输出中查找_NET_WM_PID(CARDINAL)...所以我们使用这个命令:
xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
Run Code Online (Sandbox Code Playgroud)
这为您提供了最顶层的活动窗口进程ID.
更加三得利,只用一个命令做所有事情......:
xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
Run Code Online (Sandbox Code Playgroud)
现在我可以通过我的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;
}
Run Code Online (Sandbox Code Playgroud)
Nou*_*him 19
关于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......
总结一下:
X不提供窗口ID和pids之间的任何可靠关联,并且正如Noufal所观察到的,在X桌面上提供的窗口可能来自许多不同的机器,并且两个远程客户端可能碰巧使用相同的PID,因为它只是唯一的机.参看 如何从进程ID获取X11窗口?
X似乎没有提供一个界面,询问哪个是最顶层的窗口,或者一个窗口是否遮挡另一个窗口.同样具有特权访问权限...... 如何使用xlib识别顶级X11窗口?
常用的窗口管理器和Qt不会授予您对X的特权访问权限
如果没有找到最顶层窗口的方法,以及窗口id与匹配pid的可靠关联,我们无法解决问题.
我们可以找到哪个窗口有焦点,这可能就是我们想要的.但再次,没有wid到pid地图......
所以,抱歉,看起来无法完成.
派对非常晚,但我遇到了类似的问题,我认为这可以帮助那些遇到同样问题的人.有一个命令行技巧,你可以尝试execvp它,或执行它将输出重定向到你的代码
xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME WM_CLASS
Run Code Online (Sandbox Code Playgroud)
给出窗口名称以及程序名称.例如,对于这个标签,它给了我
_NET_WM_NAME(UTF8_STRING) = "linux - Getting pid and details for topmost window - Stack Overflow - Mozilla Firefox"
WM_CLASS(STRING) = "Navigator", "Firefox"
Run Code Online (Sandbox Code Playgroud)