Respuestas:
xdotool
expone la ubicación del puntero ( xdotool getmouselocation
), y las versiones recientes (desde 2.20110530.1) también indican qué ventana está en esa ubicación . Ninguno de xwininfo
, wmctrl
o versiones anteriores de xdotool
parecer que tienen una forma para que coincida con una ventana por una posición de la pantalla donde es visible.
La llamada a la biblioteca X subyacente es XQueryPointer
(correspondiente a un QueryPointer
mensaje). Aquí hay un script simple de envoltura de Python alrededor de esta llamada (usando ctypes
). Error de comprobación omitido en gran medida. Asume que está usando la pantalla 0 (si no sabía que las pantallas podrían tener más de una pantalla, ignore esto).
#! /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
Ejemplo de uso:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
de 0
, y llamando xwininfo -root
para esta condición se resuelve esta peculiaridad .. Gracias ..
root_id.value
si 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))
El xwininfo
comando proporciona este tipo de salida, pero debe hacer clic en la ventana en la que desea información:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Al hacerlo, xwininfo | grep 'Window id:'
podría darte algo de lo que puedes analizar la identificación.
xwinfo |grep window id:' &
y siguiéndolo con xdotool click 1
... pero eso corre el riesgo de que el primer plano se click
ejecute antes de que xdotool
agarre el mouse. Me Rathen no haría uso de un 'sueño nominal n, por lo que aunque esta respuesta es en la pista, voy a esperar un wihile para ver si hay algo más en línea se convierte en imagen ...
intente esto, solo usa xdotool, pero su versión es al menos "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
para obtener la identificación de la ventana directamente, puede usar esto:
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 es lo suficientemente bueno como para hacerlo.
Ejecute xdotool getactivewindow
y verá el resultado (int) La ventana puede estar sobre CUALQUIER monitor. Simplemente lea dónde está ubicado el puntero x11 esperando un clic :), y no importa si se trata de una ventana remota, un servidor virtual o el tercer escritorio del entorno de escritorio del cubo. Solo funciona
Puedes jugarlo usando sleep para mejores pruebas sleep 3; xdotool click 1+2; xdotool getactivewindow
.
He visto que getwindowsfocus
devuelve el mismo valor que getactivewindow
.
Si hace los clics manualmente, verá el menú contextual, pero al hacer clic en 1 + 2 se activan ambos clics al mismo tiempo que se hace clic en la ubicación actual del mouse y se obtiene la identificación deseada.
Intentalo :)
Si tiene acceso a python-xlib , aquí hay un equivalente más corto y más pitónico a la respuesta de Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
ArchWiki tiene una buena respuesta a esto:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Utilizando sed
puede hacer esto en una sola línea, que es probablemente la forma más legible de hacerlo:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Tenga en cuenta que xdotool
faltaba en mi Debian minimal X11 mientras xprop
estaba incluido (también, sed
por supuesto).
Si no desea bifurcar sed
ni grep
puede hacer la transformación de texto por completo bash
, lo que tal vez sea un poco más seguro en caso de que la salida de xprop
cambios cambie un poco:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
De todos modos, sigue siendo una forma extraña de archivar una tarea tan simple.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
desde una consola y mover el mouse. El valor sería el mismo hasta que haga clic con el mouse o interactúe con el teclado (alt + tab, etc.)
xdotool click 1
método asincrónico mencionado en el comentario a la respuesta de Bruce Ediger . La ID de escritorio que no es cero es válida en la medida en que devuelve la imagen apropiada a través deimport -window $nonzeroID screen.png
... ¿Hay algún ajuste simple para que el script de Python devuelva ese valor para el escritorio? ?