จากสคริปต์ทุบตีมีวิธีการรับ ID ของหน้าต่าง X ภายใต้ตัวชี้เมาส์?
(แก้ไข) ฉันต้องการให้กระบวนการเป็นแบบไม่โต้ตอบ
จากสคริปต์ทุบตีมีวิธีการรับ ID ของหน้าต่าง X ภายใต้ตัวชี้เมาส์?
(แก้ไข) ฉันต้องการให้กระบวนการเป็นแบบไม่โต้ตอบ
คำตอบ:
xdotool
หมายความว่าสถานที่ชี้ ( xdotool getmouselocation
) และรุ่นล่าสุด (ตั้งแต่ 2.20110530.1) ระบุว่าหน้าต่างที่ตำแหน่งนั้นได้เป็นอย่างดี ไม่มีของxwininfo
, wmctrl
หรือรุ่นเก่าของxdotool
ปรากฏว่ามีวิธีที่จะตรงกับหน้าต่างโดยตำแหน่งหน้าจอที่มันมองเห็นได้
การเรียกไลบรารี่ X พื้นฐานคือ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:'
นั้นอาจให้บางสิ่งที่คุณสามารถแยก ID ออกมาได้
xwinfo |grep window id:' &
และตามด้วยxdotool click 1
... แต่นั่นจะเสี่ยงต่อการทำงานเบื้องหน้าclick
ก่อนที่จะxdotool
จับเมาส์ ฉัน Rathen ได้ใช้น้อยนอนหลับ `n ดังนั้นแม้ว่าคำตอบนี้อยู่บนแทร็ค, ฉันจะรอ wihile เพื่อดูว่าสิ่งที่มากขึ้นแบบอินไลน์จะเปิดขึ้น ...
ลองสิ่งนี้มันใช้เฉพาะ xdotool แต่เวอร์ชันของมันเป็นอย่างน้อย "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
เพื่อรับ ID หน้าต่างโดยตรงคุณสามารถใช้สิ่งนี้:
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 หรือเดสก์ท็อปตัวที่ 3 ของสภาพแวดล้อมคิวบ์เดสก์ท็อป เพิ่งได้ผล
sleep 3; xdotool click 1+2; xdotool getactivewindow
คุณสามารถเล่นได้โดยใช้การนอนหลับที่ดีขึ้นสำหรับการทดสอบ
ฉันได้เห็นว่าผลตอบแทนคุ้มค่าเดียวกันกว่าgetwindowsfocus
getactivewindow
หากคุณคลิกด้วยตนเองคุณจะเห็นเมนูตามบริบท แต่คลิก 1 + 2 ยิงทั้งสองคลิกในเวลาคลิกที่ตำแหน่งเมาส์ปัจจุบันและรับรหัสที่ต้องการ
ลองมัน :)
หากคุณสามารถเข้าถึงpython-xlibได้นี่คือคำตอบที่สั้นกว่าและเป็น pythonic ที่เทียบเท่ากับคำตอบของ Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
ฉันเล่นรอบกับคำตอบจากPeter.Oและเกิดขึ้นกับ:
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
ขาด Debian น้อยที่สุดของฉัน 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 + tab, ฯลฯ )
xdotool click 1
วิธีที่กล่าวถึงในความคิดเห็นเพื่อบรูซเอดิเกอร์ของคำตอบ .. ไม่ใช่ศูนย์ ID สก์ท็อปเป็นถึงขนาดที่ถูกต้องเป็นมันจะกลับภาพที่เหมาะสมผ่านimport -window $nonzeroID screen.png
.... มีบางบิดง่ายสำหรับหลามสคริปต์ที่จะกลับมาที่คุ้มค่าสำหรับเดสก์ทอป ?