如何通过Bash命令获取系统托盘内最小化的应用程序?
识别系统托盘内最小化应用的可行方案
嘿,我懂你想给lemonbar、rofi或者dmenu做个专用命令,抓取系统托盘里最小化的应用——wmctrl和xdotool搞不定确实挺闹心的,试试下面这些工具和方法,应该能解决你的问题:
1. 用gdbus查询现代托盘应用(推荐)
现在绝大多数桌面环境的系统托盘都遵循Freedesktop StatusNotifierItem规范,这类应用会通过DBus注册自己,用gdbus就能直接枚举和获取它们的信息:
- 先列出所有注册到托盘的应用:
gdbus call --session --dest org.freedktop.DBus --object-path /org/freedktop/DBus --method org.freedktop.DBus.ListNames | grep -E 'org\.freedesktop\.StatusNotifierItem|org\.kde\.StatusNotifierItem' - 要获取某个应用的具体信息(比如窗口标题),把上面输出的
<item-name>替换进去:gdbus call --session --dest <item-name> --object-path /StatusNotifierItem --method org.freedktop.StatusNotifierItem.GetTitle - 还能获取图标路径、窗口状态等更多信息,只需要调用对应的DBus方法就行,适合你后续给rofi/lemonbar做格式化输出。
2. 用xprop+xwininfo兼容旧版XEmbed托盘
有些老软件还在用传统的XEmbed托盘协议,这时候可以用X11工具链来抓取:
- 先找到系统托盘的窗口ID:
xprop -root | grep _NET_WM_SYSTEM_TRAY - 列出托盘里的所有子窗口(这些就是最小化到托盘的应用窗口):
xwininfo -children -id <tray-window-id> - 再用
xprop获取子窗口的详细信息,比如应用名称:xprop -id <child-window-id> | grep _NET_WM_NAME
3. 专用工具:systrayctl或trayiconviewer
如果不想自己写脚本解析,直接用专门的托盘管理工具更省心:
systrayctl:轻量级命令行工具,直接运行systrayctl list就能输出托盘里的所有应用,格式简洁,很适合直接喂给rofi/dmenu;还支持触发窗口恢复操作。trayiconviewer:同样是命令行工具,能列出托盘图标对应的应用信息,输出可定制。
你可以根据自己的需求选择方案,比如用gdbus的话,配合awk/sed就能把输出整理成rofi需要的菜单格式,结合图标路径还能在lemonbar里显示托盘图标~
内容的提问来源于stack exchange,提问作者sigz
相关产品推荐
相关产品推荐

