在 linux call 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。
变得更加狡猾,只需 1 个命令即可完成所有事情...:
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;
}