मैं bash में माउस पॉइंटर के नीचे X विंडो आईडी कैसे खोजूं?


20

बैश स्क्रिप्ट से, माउस पॉइंटर के नीचे X विंडो की आईडी प्राप्त करने का कोई तरीका है?

(संपादित करें) मुझे गैर-संवादात्मक होने के लिए प्रक्रिया की आवश्यकता है।

जवाबों:


25

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)

1
धन्यवाद गिल्स: यह (लगभग) वास्तव में मुझे क्या चाहिए ... यह आदर्श है लेकिन इस तथ्य के लिए कि यह डेस्कटॉप के लिए '0' का मान लौटाता है .. एक गैर-शून्य विंडो आईडी लौटा दी जाती है (डेस्कटॉप के लिए) ब्रूस एडगर के जवाब के xdotool click 1लिए टिप्पणी में उल्लिखित अतुल्यकालिक विधि द्वारा .. गैर-शून्य डेस्कटॉप आईडी वैध इंसोमुच है क्योंकि यह उचित छवि देता है .... क्या डेस्कटॉप के लिए उस मान को वापस करने के लिए अजगर स्क्रिप्ट के लिए कुछ सरल ट्वीक है? ? import -window $nonzeroID screen.png
पीटर।

@ गिल्स ... परीक्षण $(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))
एफ। हौरी

21

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:'आपको कुछ ऐसा दे सकता है जिससे आप आईडी को पार कर सकते हैं।


1
मुझे इसे गैर-संवादात्मक बनाने की आवश्यकता है ...
पीटर।

1
इसे पृष्ठभूमि में चलाकर xwinfo |grep window id:' &और इसके द्वारा इसका पालन करके इसे गैर-संवादात्मक बनाया जा सकता है xdotool click 1... लेकिन clickइससे अग्रभूमि के जोखिम xdotoolको माउस पकड़ लेता है। मैं नाममात्र की नींद का उपयोग नहीं करता, क्योंकि यह जवाब पटरी पर है, इसलिए मैं यह देखने के लिए एक प्रतीक्षा करूंगा कि क्या कुछ और इनलाइन हो जाए ...
पीटर।

8

यह कोशिश करो, यह केवल 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

1
काम किया, धन्यवाद, BTW यह उपयोगी हो सकता हैxdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
user41209

1

ऐसा करने के लिए xdotool काफी अच्छा है।

चलाएँ xdotool getactivewindowऔर आपको परिणाम (int) दिखाई देगा विंडो किसी भी मॉनिटर पर हो सकती है। बस पढ़ें जहां एक क्लिक के लिए x11 पॉइंटर स्थित है :), और कोई बात नहीं अगर यह एक दूरस्थ खिड़की, एक vncserver या क्यूब डेस्कटॉप वातावरण का तीसरा डेस्कटॉप है। बस काम करता है।

आप इसे बेहतर परीक्षण के लिए नींद का उपयोग करके खेल सकते हैं sleep 3; xdotool click 1+2; xdotool getactivewindow

मैंने देखा है कि की getwindowsfocusतुलना में एक ही मूल्य देता है getactivewindow

यदि आप मैन्युअल रूप से क्लिक करते हैं तो आपको संदर्भ मेनू दिखाई देगा, लेकिन वर्तमान माउस स्थान पर क्लिक करने और वांछित आईडी प्राप्त करने के लिए दोनों क्लिक पर 1 + 2 फायर करें।

कोशिश करो :)


1
यह सक्रिय विंडो की आईडी देता है (जहां भी वह विंडो हो सकती है), चाहे माउस विंडो पॉइंटर के अंतर्गत सक्रिय विंडो हो या न हो। प्रश्न के अनुसार: "... माउस पॉइंटर के नीचे X विंडो आईडी ढूंढें ..." (जहां भी माउस हो सकता है)।
पीटर।

1
सुधार के लिए धन्यवाद, आप सही हैं। अपडेट किया गया । मैं एक्टिवविंडो के साथ गेटमूसेल की अवधारणा को मिला रहा था, लेकिन वैसे भी, एक्सडॉटूल काफी ठंडा है।
m3nda


0

मैंने पीटर.ओ के उत्तर के साथ खिलवाड़ किया और साथ आया:

xdotool click 1|xwininfo|grep 'Window id:'

1
यह एक माउस क्लिक भेजता है, इसलिए यह एक बटन पर क्लिक करेगा जहाँ माउस कर्सर है। यह आकस्मिक रूप से उस विंडो की रिपोर्ट करेगा जहां कर्सर है यदि आप क्लिक करने के लिए फोकस का उपयोग करते हैं, लेकिन एक क्लिक इवेंट भेजना विघटनकारी है।
गिलेस एसओ- बुराई को रोकना '25

0

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##* }'

वैसे भी, इस तरह के एक सरल कार्य को संग्रहित करना अभी भी एक अजीब तरीका है।


3
यह माउस पॉइंटर के नीचे विंडो की जगह एक्टिव विंडो की आईडी देता है।
पीटर।

@ पीटर। आप सही हैं कि यह सक्रिय विंडो को लौटाता है। गलत उत्तर के लिए क्षमा करें, हालाँकि मेरे परीक्षणों के साथ इसने काम किया - शायद इसलिए कि मेरे पास फोकस-फॉलो-माउस था।
टीनो

0
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'

1
यह माउस पॉइंटर के नीचे विंडो की जगह एक्टिव विंडो की आईडी देता है।
पीटर।

ओह, मैं यहाँ मैला फोकस (फ़ोकस फॉलो माउस) मान रहा था।
blueyed

@blueyed फोकस सक्रिय विंडो पर है, और यह विंडो KEYBOARD को जवाब देती है। माउस को X11 द्वारा ट्रैक / ट्रैक किया जाता है क्योंकि यह उससे सर्वर है, और जब आप एक विंडोज़ पर क्लिक करते हैं, तो x11 विंडो क्लिक करने के लिए विंडो-मैनेजर फोकस सेट करता है। फोकस वास्तव में माउस का पालन नहीं करते हैं। आप xdotool getwindowsfocusएक कंसोल से चल रहा है और चारों ओर माउस ले जा सकते हैं। जब तक आप माउस पर क्लिक नहीं करेंगे या कीबोर्ड (alt + टैब, आदि) पर क्लिक करते हैं, तब तक मान समान होगा
m3nda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.