如何在 bash 中找到鼠标指针下的 X 窗口 ID?

如何在 bash 中找到鼠标指针下的 X 窗口 ID?

从 bash 脚本中,有没有办法获取鼠标指针下的 X 窗口的 ID?

(编辑)我需要该过程是非交互式的。

答案1

xdotool公开指针位置 ( xdotool getmouselocation),并且最新版本(自 2.20110530.1 起)也指示哪个窗口位于该位置xwininfowmctrl旧版本似乎都没有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 时触发两次单击。

尝试一下 :)

相关内容