从 bash 脚本中,有没有办法获取鼠标指针下的 X 窗口的 ID?
(编辑)我需要该过程是非交互式的。
答案1
xdotool
公开指针位置 ( xdotool getmouselocation
),并且最新版本(自 2.20110530.1 起)也指示哪个窗口位于该位置。xwininfo
或wmctrl
旧版本似乎都没有xdotool
办法通过窗口可见的屏幕位置来匹配窗口。
底层的 X 库调用是XQueryPointer
(对应于一条QueryPointer
消息)。这是一个围绕此调用的简单 Python 包装脚本(使用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)
答案2
该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 的东西。
答案3
试试这个,它只使用 xdotool,但它的版本至少是“2.20110530.1”
xdotool getmouselocation --shell | grep WINDOW
要直接获取窗口 ID,您可以使用以下命令:
sedGetValue='s/.*=\(.*\)/\1/' # or more readable: sedGetValue='s".*=\(.*\)"\1"' # as / \ confuses me
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
答案4
xdotool 足以做到这一点。
运行xdotool getactivewindow
,您将看到结果 (int) 窗口可以位于任何监视器上。只需读取等待单击的 x11 指针的位置即可:),无论它是远程窗口、vncserver 还是立方体桌面环境的第三个桌面。就可以了。
您可以使用 sleep 来播放它以进行更好的测试sleep 3; xdotool click 1+2; xdotool getactivewindow
。
我发现getwindowsfocus
返回的值与getactivewindow
.
如果您手动单击,您将看到上下文菜单,但单击 1+2 会在单击当前鼠标位置并获取所需 id 时触发两次单击。
尝试一下 :)