我想检索在后台启动的 GUI 程序的 X id,以便处理它们的 Windows 属性。到目前为止我一直在使用这个解决方法:
myprogram &
sleep 1
winID=$(wmctrl -l | awk '/./{line=$0} END{print $1;}')
但这依赖于三个重要假设:
- 该程序将花费不到 1 秒的时间来打开窗口(更不用说少于 1 秒可能太长了)
wmctrl
该窗口将附加在列表的末尾- 同时不会打开其他窗口
myprogram
打开窗口后是否会发送任何信号?我怎样才能拦截它?
答案1
为了在我的程序中获取窗口 ID,我让程序将标题设置为唯一的内容,然后让程序启动wmctrl
并解析其输出(而不是启动程序的 shell 脚本),然后报告窗口 ID(大多数通常通过文件)。
由于程序在窗口打开后才会继续,因此您无需等待太长时间。
这当然要求您可以更改myprogram
(即从源代码编译)。
答案2
使用python gi库,(假设最近启动的这个程序位于窗口堆栈的顶部)
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck , Gtk
screen=Wnck.Screen.get_default()
while Gtk.events_pending() :
Gtk.main_iteration()
all_windows=screen.get_windows_stacked()
print(all_windows[0].get_xid())
附言。未测试