Antworten:
xdotool
macht die Zeigerposition () sichtbarxdotool getmouselocation
, und neuere Versionen (seit 2.20110530.1) geben an, welches Fenster sich ebenfalls an dieser Position befindet . Keines xwininfo
, wmctrl
oder ältere Versionen xdotool
erscheinen , einen Weg zu haben ein Fenster mit einer Bildschirmposition anzupassen , wo es sichtbar.
Der zugrunde liegende Aufruf der X-Bibliothek ist XQueryPointer
(entsprechend einer QueryPointer
Nachricht). Hier ist ein einfaches Python-Wrapper-Skript, das diesen Aufruf umgibt (using ctypes
). Fehlerprüfung weitgehend weggelassen. Angenommen, Sie verwenden Bildschirm 0 (wenn Sie nicht wissen, dass Anzeigen mehr als einen Bildschirm haben können, ignorieren Sie dies).
#! /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
Anwendungsbeispiel:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
für 0
und Aufrufen xwininfo -root
für diese Bedingung behebt diese Eigenart .. Danke ..
root_id.value
wenn 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))
Der xwininfo
Befehl gibt diese Art von Ausgabe aus, aber Sie müssen auf das Fenster klicken, zu dem Sie Informationen wünschen:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Wenn Sie dies tun xwininfo | grep 'Window id:'
, erhalten Sie möglicherweise etwas, aus dem Sie die ID analysieren können.
xwinfo |grep window id:' &
wird und anschließend xdotool click 1
..., aber dies birgt die Gefahr, dass der Vordergrund click
ausgeführt wird, bevor xdotool
die Maus greift. Ich würde raten, kein nominales `sleep n 'zu verwenden. Obwohl diese Antwort auf dem richtigen Weg ist, werde ich eine Weile warten, um zu sehen, ob etwas mehr Inline auftaucht ...
Versuchen Sie dies, es verwendet nur xdotool, aber seine Version ist mindestens "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
Um die Fenster-ID direkt zu erhalten, können Sie Folgendes verwenden:
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 ist dafür gut genug.
Führen xdotool getactivewindow
Sie aus und Sie werden das Ergebnis sehen (int) Das Fenster kann sich über JEDEM Monitor befinden. Lesen Sie einfach, wo sich der x11-Zeiger befindet, der auf einen Klick wartet :), und egal, ob es sich um ein Remote-Fenster, einen vncserver oder den dritten Desktop der Cube-Desktop-Umgebung handelt. Funktioniert einfach.
Sie können es zum besseren Testen mit Sleep spielen sleep 3; xdotool click 1+2; xdotool getactivewindow
.
Ich habe gesehen, dass getwindowsfocus
derselbe Wert als zurückgibt getactivewindow
.
Wenn Sie die Klicks manuell ausführen, wird das Kontextmenü angezeigt. Wenn Sie jedoch auf 1 + 2 klicken, werden beide Klicks gleichzeitig ausgelöst, indem Sie auf die aktuelle Mausposition klicken und die gewünschte ID abrufen.
Versuch es :)
Wenn Sie Zugriff auf python-xlib haben , finden Sie hier eine kürzere und pythonischere Entsprechung zu Gilles 'Antwort:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Ich spielte mit der Antwort von Peter.O herum und fand:
xdotool click 1|xwininfo|grep 'Window id:'
ArchWiki hat eine gute Antwort darauf:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Mit sed
können Sie dies in einer einzigen Zeile tun. Dies ist wahrscheinlich die am besten lesbare Methode:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Beachten Sie, dass xdotool
in meinem Debian-Minimal-X11 etwas fehlte, während xprop
es enthalten war (ebenfalls sed
natürlich).
Wenn Sie nicht verzweigen möchten oder die Textumwandlung sed
nicht grep
vollständig durchführen können bash
, ist dies möglicherweise etwas sicherer, falls sich die Ausgabe xprop
etwas ändert:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
Trotzdem ist es immer noch eine seltsame Art, eine so einfache Aufgabe zu archivieren.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
von einer Konsole aus und das Bewegen der Maus überprüfen . Der Wert
xdotool click 1
Methode im Kommentar zu erwähnt Bruce Ediger der Antwort .. die nicht-Null - Desktop - ID gilt so sehr , wie es das entsprechende Bild über kehrtimport -window $nonzeroID screen.png
.... gibt es ein paar einfache zwicken für den python - Skript zurück , dass Wert für den Desktop ?