Как я нахожу идентификатор X-окна под указателем мыши в ударе?

Выход из системы пользователь 'имя пользователя':

skill -KILL -u username

Посмотрите man skill

20
06.07.2011, 07:33
7 ответов

xdotool выставляет местоположение указателя (xdotool getmouselocation), и последние версии (начиная с 2.20110530.1) указывают, какое окно в том местоположении также. Ни один из xwininfo, wmctrl или более старые версии xdotool кажись, иметь способ соответствовать окну экранным положением, где это видимо.

Лежание в основе X вызовов библиотеки XQueryPointer (соответствующий a QueryPointer сообщение). Вот простой сценарий обертки Python вокруг этого вызова (использование ctypes). Проверка ошибок в основном опущена. Предполагает, что Вы используете экран 0 (если Вы не знали, что дисплеи могли иметь больше чем один экран, проигнорировать это).

#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
                         byref(root_x), byref(root_y),
                         byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value

Пример использования:

xwininfo -tree -id $(XQueryPointer)
25
27.01.2020, 19:43
  • 1
    Спасибо Gilles: Это (почти) точно, в чем я нуждаюсь... Это идеально, но для того, что это возвращает значение '0' для самого рабочего стола.. Ненулевое окно ID возвращается (для рабочего стола) асинхронным xdotool click 1 метод, упомянутый в комментарии ответу Bruce Ediger.. Ненулевой настольный идентификатор действителен, поскольку он возвращает соответствующее изображение через import -window $nonzeroID screen.png.... Есть ли некоторая простая тонкая настройка для сценария Python для возвращения того значения для рабочего стола? –  Peter.O 06.07.2011, 16:48
  • 2
    @Gilles... Тестирование $(XQueryPointer) для 0, и вызов xwininfo -root поскольку это условие разрешает эту причуду..Спасибо.. –  Peter.O 06.07.2011, 17:34
  • 3
    @fred, Непротестированный, потому что я не перед машиной Unix: попытайтесь печатать root_id.value если child_id.value == 0. –  Gilles 'SO- stop being evil' 06.07.2011, 17:39
  • 4
    Да, Ваша модификация хорошо работает.. if child_id.value == 0: print root_id.value else: print child_id.value :) –  Peter.O 06.07.2011, 18:23
  • 5
    sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer)) –  F. Hauri 15.02.2015, 00:19

xwininfo команда дает этот вид вывода, но действительно необходимо нажать на окно, о котором Вы хотите информацию:

% xwininfo
xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xa0000d "flask"

...

Так выполнение: xwininfo | grep 'Window id:' мог бы дать Вам что-то, из чего можно проанализировать идентификатор.

21
27.01.2020, 19:43
  • 1
    мне нужен он, чтобы быть неинтерактивным... –  Peter.O 06.07.2011, 07:32
  • 2
    Это может быть сделано быть неинтерактивным путем выполнения его в фоновом режиме xwinfo |grep window id:' &, и следующий за этим xdotool click 1... но это рискует передним планом click выполнение перед xdotool захватывает мышь. Я был бы rathen не использовать номинальный 'сон n, поэтому хотя этот ответ на правильном пути, я буду ожидать wihile, чтобы видеть, поднимается ли что-то больше встроенное... –  Peter.O 06.07.2011, 08:39

попробуйте это, это использует только xdotool, но его версия - по крайней мере "2.20110530.1"

xdotool getmouselocation --shell | grep WINDOW

для получения идентификатора окна непосредственно, можно использовать это:

sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
8
27.01.2020, 19:43

Я играл вокруг с ответом от Peter. O и придумал:

xdotool click 1|xwininfo|grep 'Window id:'
0
27.01.2020, 19:43
  • 1
    , Которая отправляет щелчок мышью, таким образом, это было бы, например, нажимать кнопку, где курсор мыши. Это случайно сообщило бы об окне, где курсор находится в том, если Вы используете щелчок, чтобы сфокусироваться, но отправка события щелчка разрушительна. –  Gilles 'SO- stop being evil' 25.05.2015, 14:28

ArchWiki имеет хороший ответ на это:

activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}

Используя sed можно сделать это в одной строке, которая является, вероятно, самым читаемым способом сделать это:

activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"

Отметьте это xdotool пропускал в моем Debian минимальный X11 в то время как xprop был включен (аналогично sed конечно).

Если Вы не хотите разветвляться sed ни grep можно сделать текстовое преобразование это полностью в bash, который, возможно, безопасен в случае, если вывод xprop изменения немного:

activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'

Так или иначе это - все еще странный способ заархивировать такую простую задачу.

0
27.01.2020, 19:43
  • 1
    Это дает идентификатор активного окна вместо окна под указателем мыши. –  Peter.O 24.11.2014, 14:35
  • 2
    @Peter. O Вы правы, что это действительно возвращает активное окно. Извините за неправильный ответ однако с моими тестами это работало - вероятно, потому что я had focus-follows-mouse на. –  Tino 29.05.2015, 15:08
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
.
0
27.01.2020, 19:43

XDOTool достаточно хорош, чтобы сделать это.

запустить XDOTOOL GetActiveWindow , и вы увидите результат (INT) Окно может быть над любым монитором. Просто прочитайте, где находится указатель X11, ожидающий щелчка :), и неважно, если это удаленное окно, VNCServer или 3-го рабочего стола для рабочего стола Cube. Просто работает.

Вы можете сыграть его, используя сон для лучшего тестирования Сон 3; XDOTool Click 1 + 2; xdotool getactactivewindow .

Я вижу, что GetWindowsFocus возвращает одинаковое значение, чем GetActiveWindow .

Если вы выполните клики вручную, вы увидите контекстное меню, но щелкните 1 + 2 срабатывания оба щелчка во время нажатия на текущее местоположение мыши и получают нужный идентификатор.

Попробуйте это :)

1
27.01.2020, 19:43

Теги

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