Получение pid и деталей для самого верхнего окна

Кто-либо знает, как получить PID главного активного окна и затем как получить свойства окна с помощью PID? Я имею в виду свойства как имя процесса, название программы, и т.д.

Я использую QT в соответствии с Linux (Ubuntu 9.10).

17
задан Charles Stewart 12 January 2010 в 10:40
поделиться

5 ответов

PID владельца окна хранится в свойстве X _NET_WM_PID. Обратите внимание, что это только де-факто стандарт.

Сначала необходимо найти идентификатор окна, а затем запросить это свойство. Я не знаю ни одной абстракции, предусмотренной QT, так что вам, вероятно, придётся использовать xlib или xcb.

Для начала поиграйте с инструментом xprop.

5
ответ дан 30 November 2019 в 10:18
поделиться

XGETINPUTFOCUS XGETINPUTFOCUS скажет вам, какое окно имеет фокус, что, вероятно, более интереснее, чем самой самой высокой. Ср XFree86's XGETINPUTFOCUS MANPAGE .

Если это действительно самое верхнее окно, а не окно с фокусом, вы после того, как вы, ну, я не думаю, что есть простой звонок для этого, потому что Xlib, похоже, не предлагает никакого способа Запрос глобального порядка укладки, который является структурой данных, которая говорит вам, какие окна перед какими другими.

Как только у вас есть правый идентификатор окна, XPROP будет список PID под _net_wm_pid_ - хотя не все окна имеют такое свойство ...

PostScript Больше мыслей; Давно с тех пор, как я думал о xlib ...

для суммирования:

  1. x не предлагает ни одной надежной ассоциации между идентификаторами окна и PID, а как Noufal наблюдается, окна служили на X Desktop может прийти от многих разных машин, и два удаленных клиента могут использовать один и тот же PID, поскольку он только уникален на машину. Ср Как получить окно X11 из идентификатора процесса?

  2. X, похоже, не предлагает интерфейс, спрашивающую, которое является самой верхней частью окна, или одно окно окклюзию другой. Аналогично с привилегированным доступом ... ср. Как определить верхний уровень X11 Windows с использованием XLib?

  3. Обычно доступные оконные менеджеры и Qt не дают привилегированном доступе к X

  4. без способа поиска самого верхнего окна и надежной ассоциации ID окна к соответствующему PID, мы не можем решить вопрос.

  5. Мы можем найти, какое окно имеет фокус, и это, вероятно, мы хотим. Но опять же, без проживания на карте PID ...

Итак, извините, похоже, он не может быть сделан.

5
ответ дан 30 November 2019 в 10:18
поделиться

Вместо изменений в момент заказа (который будет очень дорого), попробуйте изменять изменения в неработающем экране и Убедитесь, что растровое изображение - 32 бита (ARGB888).

-121--2672348-

Один из вещей, о x - это то, что она прозрачная сеть. Вполне возможно, что фактическое окно, отображаемое в верхней части (который имеет фокус), работает на машине, отличной от вашего собственного, в этом случае идентификатор процесса, работающего внутри окна, не имеет смысла на вашем компьютере.

Можете ли вы немного разработать то, что вы хотите сделать? Я думаю, что здесь есть некоторые недостающие детали. В идеале вам следует работать на уровне X, а не на конкретной машине.

19
ответ дан 30 November 2019 в 10:18
поделиться

Установите WMCTRL (из репозиториев). WMCTRL -LP может быть то, что вы хотите. Вы всегда можете взглянуть на источник, если вам это нужно из вашей программы.

0
ответ дан 30 November 2019 в 10:18
поделиться

В Linux Call есть команда XPROP, которая является утилитой для отображения свойств окон на X Server. В Linux XProp -Root дает вам свойства корня Windows, а также другие активные программы. Тогда вы можете получить идентификатор активного окна, используя эту команду:

xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)

, чтобы получить просто Активный идентификатор окна (без «_net_ Active_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}'

Это дает вам самый верхний идентификатор процесса активного окна.

Чтобы быть более Trickey и делать все в команду всего 1 команды ...:

 xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'

Теперь я могу запустить эти команды через мою программу C ++ (в Linux), используя POPEN-функцию, Grab 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;
}
24
ответ дан 30 November 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: