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

Pet*_*r.O 26 xorg utilities mouse window

从 bash 脚本中,是否有某种方法可以获取鼠标指针下 X 窗口的 ID?

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

Gil*_*il' 35

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
Run Code Online (Sandbox Code Playgroud)

用法示例:

xwininfo -tree -id $(XQueryPointer)
Run Code Online (Sandbox Code Playgroud)


Bru*_*ger 24

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"

...
Run Code Online (Sandbox Code Playgroud)

这样做:xwininfo | grep 'Window id:'可能会给你一些你可以解析 ID 的东西。


Aqu*_*wer 10

试试这个,它只使用 xdotool,但它的版本至少是“2.20110530.1”

xdotool getmouselocation --shell | grep WINDOW
Run Code Online (Sandbox Code Playgroud)

要直接获取窗口 ID,您可以使用:

sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
Run Code Online (Sandbox Code Playgroud)

  • 成功了,谢谢,顺便说一句,这可能很有用 `xdotool getmouselocation --shell | grep 窗口 | awk -F "=" '{print $2}'` (2认同)

小智 5

如果您有权访问python-xlib,这里有一个更短、更Pythonic的相当于 Gilles 的答案:

from Xlib.display import Display

display = Display()
window = display.screen().root
result = window.query_pointer()

print(result.child.id)
Run Code Online (Sandbox Code Playgroud)