XgetInputFocus идентификатор окна никогда не соответствует идентификаторам окна, извлеченными через PID (через XgetWindoLinux

Ответить
Anonymous
 XgetInputFocus идентификатор окна никогда не соответствует идентификаторам окна, извлеченными через PID (через XgetWindo

Сообщение Anonymous »

Я хочу проверить, находится ли окно конкретного процесса в фокусе. Я знаю PID процесса. < /P>
Пример минимального кода: < /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

Window get_focused_window(Display *display) {
Window focus_window;
int revert_to;
XGetInputFocus(display, &focus_window, &revert_to);
return focus_window;
}

Window get_window_id(Display *display, pid_t pid) {
Window root = DefaultRootWindow(display);
Window parent;
Window *children;
unsigned int num_children;
Window found_window = 0;

// Query the window tree
if (XQueryTree(display, root, &root, &parent, &children, &num_children)) {
for (unsigned int i = 0; i < num_children; i++) {
// Get the PID of the window
Atom atom = XInternAtom(display, "_NET_WM_PID", True);
Atom actual_type;
int actual_format;
unsigned long nitems, bytes_after;
unsigned char *prop = NULL;

if (XGetWindowProperty(display, children[i], atom, 0, sizeof(pid_t), False, AnyPropertyType,
&actual_type, &actual_format, &nitems, &bytes_after, &prop) == Success) {
if (nitems > 0) {
pid_t window_pid = *(pid_t *)prop;
if (window_pid == pid) {
found_window = children[i];
Window focused_window = get_focused_window(display);
printf("Window ID:         [%lu] %s\n", found_window, (found_window == focused_window) ? "(Focused)" : "");
}
}
XFree(prop);
}
}
}

if (children) {
XFree(children);
}

return found_window;
}

int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return EXIT_FAILURE;
}

pid_t pid = atoi(argv[1]);
Display *display = XOpenDisplay(NULL);
if (!display) {
fprintf(stderr, "Unable to open X display\n");
return EXIT_FAILURE;
}
for (int i = 0; i < 100; i++){  // prevent infinite loop
// Get the focused window ID
Window focused_window = get_focused_window(display);
printf("Focused Window ID: [%lu]\n", focused_window);

// Get the window ID for the specified PID
Window window_id = get_window_id(display, pid);
if (!window_id) {
printf("No window found for PID %d\n", pid);
}

sleep(1);
}

XCloseDisplay(display);
return EXIT_SUCCESS;
}
< /code>
Эта программа печатает все идентификаторы окон, связанные с данным PID, а также идентификатор окна в настоящее время сфокусированного окна, каждые 1 секунду. < /p>
Как я использую это: < /p>
[list]
[*] Откройте некоторую программу (я выбрал Geany) < /li>
 run ps aux < /li>






 gean 9945
[*] Составьте минимальный пример программы с GCC main.c -lx11 
[*] Запуск ./a.out 9945
[*] Нажмите Geany, чтобы переключить фокус на
[*] obsere, что окно -идентификатор. Window
[/list]
Ожидание: первый (самый старый) идентификатор окна, повторный через xgetwindowproperty (), такой же, как идентификатор окна, возвращаемое xgetinputfocus ()


Подробнее здесь: https://stackoverflow.com/questions/797 ... id-through
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»