Jawaban:
xdotool
memperlihatkan lokasi penunjuk ( xdotool getmouselocation
), dan versi terbaru (sejak 2.20110530.1) menunjukkan jendela mana yang berada di lokasi itu juga . Tak satu pun dari xwininfo
, wmctrl
atau versi yang lebih lama dari xdotool
tampaknya memiliki cara untuk mencocokkan jendela dengan posisi layar di mana itu terlihat.
Panggilan pustaka X yang mendasarinya adalah XQueryPointer
(terkait dengan QueryPointer
pesan). Berikut ini skrip pembungkus Python sederhana untuk panggilan ini (menggunakan ctypes
). Pemeriksaan kesalahan sebagian besar dihilangkan. Asumsikan Anda menggunakan layar 0 (jika Anda tidak tahu bahwa tampilan bisa memiliki lebih dari satu layar, abaikan ini).
#! /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
Contoh penggunaan:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
untuk 0
, dan menyerukan xwininfo -root
untuk kondisi ini menyelesaikan permainan kata-kata ini .. Terima kasih ..
root_id.value
jika 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))
The xwininfo
perintah memberikan semacam ini output, tetapi Anda harus mengklik pada jendela Anda ingin info tentang:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Melakukan hal itu: xwininfo | grep 'Window id:'
mungkin memberi Anda sesuatu yang bisa Anda uraikan dari ID.
xwinfo |grep window id:' &
, dan mengikutinya dengan xdotool click 1
... tapi itu berisiko click
mengeksekusi foreground sebelum xdotool
meraih mouse. Saya tidak akan menggunakan nominal `sleep n, jadi meskipun jawaban ini tepat, saya akan menunggu sebentar untuk melihat apakah sesuatu yang lebih inline muncul ...
coba ini, ini hanya menggunakan xdotool, tetapi versinya paling tidak "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
untuk mendapatkan id jendela secara langsung, Anda dapat menggunakan ini:
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 cukup baik untuk melakukannya.
Jalankan xdotool getactivewindow
dan Anda akan melihat hasilnya (int) Jendela bisa melalui monitor APAPUN. Cukup baca di mana letak pointer x11 menunggu klik :), dan tidak masalah apakah itu jendela jarak jauh, vncserver, atau desktop ke-3 dari lingkungan desktop kubus. Hanya bekerja.
Anda dapat memainkannya menggunakan sleep untuk pengujian yang lebih baik sleep 3; xdotool click 1+2; xdotool getactivewindow
.
Saya telah melihat bahwa getwindowsfocus
mengembalikan nilai yang sama daripada getactivewindow
.
Jika Anda melakukan klik secara manual Anda akan melihat menu kontekstual, tetapi klik 1 + 2 menembakkan kedua klik pada saat mengklik pada lokasi mouse saat ini dan mendapatkan id yang diinginkan.
Cobalah :)
Jika Anda memiliki akses ke python-xlib , berikut ini persamaan yang lebih pendek dan lebih pythonic dengan jawaban Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Saya bermain-main dengan jawaban dari Peter.O dan muncul dengan:
xdotool click 1|xwininfo|grep 'Window id:'
ArchWiki memiliki jawaban yang bagus untuk ini:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Menggunakan sed
Anda dapat melakukan ini dalam satu baris, yang mungkin merupakan cara yang paling mudah dibaca untuk melakukannya:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Catat itu xdotool
hilang di Debian minimal X11 saya saat xprop
dimasukkan (juga sed
tentu saja).
Jika Anda tidak ingin melakukan fork, Anda sed
juga tidak grep
dapat melakukan transformasi teks seluruhnya bash
, yang mungkin sedikit lebih aman jika output darixprop
perubahan sedikit:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
Bagaimanapun, ini masih merupakan cara aneh untuk mengarsipkan tugas yang begitu sederhana.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
dari konsol dan menggerakkan mouse. Nilai akan sama sampai Anda mengklik mouse atau berinteraksi keyboard (alt + tab, dll)
xdotool click 1
metode yang disebutkan dalam komentar untuk Bruce Ediger ini jawabannya .. The-nol non ID desktop sedemikian rupa berlaku karena mengembalikan gambar yang sesuai melaluiimport -window $nonzeroID screen.png
.... Apakah ada beberapa Tweak sederhana untuk script python untuk kembali bahwa nilai untuk desktop ?