Câu trả lời:
xdotool
hiển thị vị trí con trỏ ( xdotool getmouselocation
) và các phiên bản gần đây (kể từ 2.20110530.1) cho biết cửa sổ nào cũng ở vị trí đó . Không ai trong số xwininfo
, wmctrl
hoặc phiên bản cũ của xdotool
xuất hiện để có một cách để phù hợp với một cửa sổ bằng một vị trí màn hình mà nó nhìn thấy được.
Cuộc gọi thư viện X bên dưới là XQueryPointer
(tương ứng với một QueryPointer
tin nhắn). Đây là một tập lệnh bao bọc Python đơn giản xung quanh cuộc gọi này (sử dụng ctypes
). Lỗi kiểm tra phần lớn bị bỏ qua. Giả sử bạn đang sử dụng màn hình 0 (nếu bạn không biết rằng màn hình có thể có nhiều hơn một màn hình, hãy bỏ qua điều này).
#! /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
Ví dụ sử dụng:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
cho 0
, và gọi xwininfo -root
cho tình trạng này giải quyết những đứa này .. Cảm ơn ..
root_id.value
nếu 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))
Các xwininfo
lệnh cho loại đầu ra, nhưng bạn phải nhấp chuột vào cửa sổ bạn muốn thông tin về:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Vì vậy, làm: xwininfo | grep 'Window id:'
có thể cung cấp cho bạn một cái gì đó bạn có thể phân tích ID ra.
xwinfo |grep window id:' &
và theo dõi nó bằng xdotool click 1
... nhưng điều đó có nguy cơ tiền cảnhclick
thực hiện trước khi xdotool
bắt chuột. Tôi muốn Rathen không sử dụng một danh nghĩa 'giấc ngủ n, vì vậy mặc dù câu trả lời này đang đi đúng hướng, tôi sẽ đợi một wihile để xem nếu một cái gì đó hơn inline lần lượt lên ...
Hãy thử điều này, nó chỉ sử dụng xdotool, nhưng phiên bản của nó ít nhất là "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
để lấy id cửa sổ trực tiếp, bạn có thể sử dụng:
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 là đủ tốt để làm như vậy.
Chạy xdotool getactivewindow
và bạn sẽ thấy kết quả (int) Cửa sổ có thể qua bất kỳ màn hình nào. Chỉ cần đọc vị trí của con trỏ x11 đang chờ nhấp chuột :) và không có vấn đề gì nếu đó là cửa sổ từ xa, vncserver hoặc máy tính để bàn thứ 3 của môi trường máy tính để bàn. Chỉ cần làm việc.
Bạn có thể chơi nó bằng cách sử dụng giấc ngủ để kiểm tra tốt hơn sleep 3; xdotool click 1+2; xdotool getactivewindow
.
Tôi đã thấy rằng getwindowsfocus
trả về cùng một giá trị hơn getactivewindow
.
Nếu bạn thực hiện các nhấp chuột theo cách thủ công, bạn sẽ thấy menu theo ngữ cảnh, nhưng nhấp 1 + 2 sẽ kích hoạt cả hai lần nhấp khi nhấp vào vị trí chuột hiện tại và nhận id mong muốn.
Thử nó :)
Nếu bạn có quyền truy cập vào python-xlib , thì đây là một pythonic ngắn hơn và nhiều hơn tương đương với câu trả lời của Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Tôi đùa giỡn với câu trả lời từ Peter.O và nghĩ ra:
xdotool click 1|xwininfo|grep 'Window id:'
ArchWiki có một câu trả lời tốt cho điều này:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Sử dụng sed
bạn có thể làm điều này trong một dòng duy nhất, đó có lẽ là cách dễ đọc nhất để làm điều đó:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Lưu ý rằng xdotool
đã bị thiếu trong Debian tối thiểu X11 của tôi trong khi xprop
được đưa vào ( sed
dĩ nhiên tương tự ).
Nếu bạn không muốn rẽ nhánh sed
cũng không grep
thể thực hiện chuyển đổi văn bản hoàn toàn bash
, điều này có thể an toàn hơn một chút trong trường hợp đầu ra xprop
thay đổi một chút:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
Dù sao, đó vẫn là một cách kỳ lạ để lưu trữ một nhiệm vụ đơn giản như vậy.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
từ bàn điều khiển và di chuyển chuột xung quanh. Giá trị sẽ giống nhau cho đến khi bạn nhấp chuột hoặc bàn phím tương tác (tab alt +, v.v.)
xdotool click 1
phương pháp không đồng bộ được đề cập trong nhận xét cho câu trả lời của Bruce Ediger .. ID máy tính để bàn khác không là hợp lệ vì nó trả về hình ảnh phù hợp thông quaimport -window $nonzeroID screen.png
.... Có một số điều chỉnh đơn giản để tập lệnh python trả về giá trị đó cho máy tính để bàn ?