जवाबों:
xdotool
सूचक स्थान ( xdotool getmouselocation
), और हाल के संस्करणों को उजागर करता है (2.20110530.1 के बाद से) यह दर्शाता है कि उस स्थान पर कौन सी खिड़की है । कोई भी xwininfo
, wmctrl
या पुराने संस्करण xdotool
दिखाई नहीं देते हैं , एक खिड़की की स्क्रीन की स्थिति से मेल खाने का एक तरीका है जहां यह दिखाई देता है।
अंतर्निहित एक्स लाइब्रेरी कॉल XQueryPointer
( QueryPointer
संदेश के अनुरूप ) है। इस कॉल (उपयोग 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:'
आपको कुछ ऐसा दे सकता है जिससे आप आईडी को पार कर सकते हैं।
xwinfo |grep window id:' &
और इसके द्वारा इसका पालन करके इसे गैर-संवादात्मक बनाया जा सकता है xdotool click 1
... लेकिन click
इससे अग्रभूमि के जोखिम xdotool
को माउस पकड़ लेता है। मैं नाममात्र की नींद का उपयोग नहीं करता, क्योंकि यह जवाब पटरी पर है, इसलिए मैं यह देखने के लिए एक प्रतीक्षा करूंगा कि क्या कुछ और इनलाइन हो जाए ...
यह कोशिश करो, यह केवल 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 या क्यूब डेस्कटॉप वातावरण का तीसरा डेस्कटॉप है। बस काम करता है।
आप इसे बेहतर परीक्षण के लिए नींद का उपयोग करके खेल सकते हैं sleep 3; xdotool click 1+2; xdotool getactivewindow
।
मैंने देखा है कि की getwindowsfocus
तुलना में एक ही मूल्य देता है getactivewindow
।
यदि आप मैन्युअल रूप से क्लिक करते हैं तो आपको संदर्भ मेनू दिखाई देगा, लेकिन वर्तमान माउस स्थान पर क्लिक करने और वांछित आईडी प्राप्त करने के लिए दोनों क्लिक पर 1 + 2 फायर करें।
कोशिश करो :)
यदि आपके पास अजगर-एक्सलिब तक पहुंच है , तो यहां गिल्स के उत्तर के बराबर एक छोटा और अधिक पायथोनिक है :
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
मेरे डेबियन न्यूनतम 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 + टैब, आदि) पर क्लिक करते हैं, तब तक मान समान होगा
xdotool click 1
लिए टिप्पणी में उल्लिखित अतुल्यकालिक विधि द्वारा .. गैर-शून्य डेस्कटॉप आईडी वैध इंसोमुच है क्योंकि यह उचित छवि देता है .... क्या डेस्कटॉप के लिए उस मान को वापस करने के लिए अजगर स्क्रिप्ट के लिए कुछ सरल ट्वीक है? ?import -window $nonzeroID screen.png