в linux есть команда call xprop, которая является утилитой для отображения свойств окна на X-сервере. В Linux xprop -root
предоставляет вам свойства корневых окон, а также другие активные программы. тогда вы можете получить идентификатор активного окна с помощью этой команды:
xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)
чтобы получить просто идентификатор активного окна (без "_NET_ACTIVE_WINDOW (WINDOW): идентификатор окна №" в начале строки) используйте эту команду:
xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
теперь вы можете сохранить выходные данные этой команды в определенной пользователем переменной:
myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
xprop имеет атрибут call -id. Этот аргумент позволяет пользователю выбрать идентификатор окна в командной строке. Мы должны искать _NET_WM_PID (CARDINAL) в выводе ... поэтому мы используем эту команду:
xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
это дает вам самый верхний активный идентификатор окна процесса.
чтобы быть хитрее и делать все за 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;
}