Ответы:
xdotool
предоставляет указатель location ( xdotool getmouselocation
), и последние версии (начиная с 2.20110530.1) указывают, какое окно также находится в этом месте . Ни одна из xwininfo
, wmctrl
или более ранние версии не xdotool
имеют возможности сопоставить окно с положением экрана, где оно видно.
Основной вызов библиотеки X - это XQueryPointer
(соответствует 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)
$(XQueryPointer)
на 0
, и вызов xwininfo -root
для этого условия устраняющего этой причуды .. Спасибо ..
root_id.value
если child_id.value == 0
.
if child_id.value == 0: print root_id.value
else: print child_id.value
:)
sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
Команда 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:'
может дать вам то, что вы можете разобрать ID из.
xwinfo |grep window id:' &
и следуя за ним xdotool click 1
... но это создает риск выполнения переднего плана click
перед тем, как xdotool
схватить мышь. Я бы даже не использовал номинальное `sleep n, поэтому, хотя этот ответ на ходу, я подожду пока, чтобы увидеть, не появится ли что-нибудь более встроенное ...
попробуйте это, он использует только 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
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool достаточно хорош для этого.
Запустите, xdotool getactivewindow
и вы увидите результат (int) Окно может быть над любым монитором. Просто прочитайте, где находится указатель x11, ожидающий щелчка :), и неважно, удаленное ли это окно, vncserver или 3-й рабочий стол в среде рабочего стола куба. Просто работает.
Вы можете играть в нее, используя сон для лучшего тестирования sleep 3; xdotool click 1+2; xdotool getactivewindow
.
Я вижу, что getwindowsfocus
возвращает то же значение, чем getactivewindow
.
Если вы сделаете щелчки вручную, вы увидите контекстное меню, но щелчок 1 + 2 запускает оба щелчка одновременно, щелкая текущее местоположение мыши и получая нужный идентификатор.
Попытайся :)
Если у вас есть доступ к python-xlib , вот более короткий и более питонический эквивалент ответа Жиля:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Я поиграл с ответом от Питера. И придумал:
xdotool click 1|xwininfo|grep 'Window id:'
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##* }'
Во всяком случае, это все еще странный способ архивировать такую простую задачу.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
из консоли и перемещение мыши. Значение будет одинаковым до тех пор, пока вы не нажмете кнопку мыши или не будете взаимодействовать с клавиатурой (alt + tab и т. Д.)
xdotool click 1
метода, упомянутого в комментарии к ответу Брюса Эдигера . Ненулевой идентификатор рабочего стола действителен, так как он возвращает соответствующее изображение черезimport -window $nonzeroID screen.png
.... Есть ли какая-то простая настройка для скрипта Python, возвращающая это значение для рабочего стола ?