如何在系统托盘上自动启动应用程序?

如何在系统托盘上自动启动应用程序?

我希望 Audacious 和 Transmission 在登录时自动在系统托盘上启动,如果我只是将它们添加到自动启动,它们就会打开,我必须手动关闭它们。我该怎么做?

我认为从问题描述中可以清楚地看出,问题不在于关闭这些应用程序到系统托盘或自动启动它们。我希望它们在我登录时自动作为系统托盘上的图标启动。

为什么我的问题被标记为与我问的问题不符的重复问题?

答案1

首选方案

如果应用程序提供在托盘中启动的选项,毫无疑问这是首选选项。

如果不是,你要么需要编辑应用程序的代码并重新编译(这不是最明显的选择),要么需要“修复”启动过程的行为。这个脚本在这种情况下可以完成这项工作。

关于这个答案

我故意忽略了你问题中的这句话:

“不关闭这些应用程序到系统托盘”

自从关上窗户自从它出现之后,将图标留在托盘中,简直就是我们唯一的选择。有效地但你不会注意到其中的差别。

解释

  • 脚本启动应用程序,运行您作为第一个参数给出的命令。

  • 然后脚本检查窗口列表(借助wmctrl)中的窗口,并使用进程号您启动的应用程序。

  • 如果出现窗口,则会在以下wmctrl命令的帮助下立即正常关闭:

      wmctrl -ic <window_id>
    
  • 结果:

在此处输入图片描述

没有传输(在此示例中)窗口根本。显然该图像来自 Unity,但在 上其工作原理相同lxde

为了防止由于某种原因窗口可能不出现而出现无限循环,脚本对窗口出现的时间设置了 30 秒的限制。

笔记

无需提及,脚本只会在应用程序启动时在系统托盘中启动应用程序系统托盘图标,否则它将直接关闭应用程序完全地如果仅窗口被关闭。

剧本

#!/usr/bin/env python3
import subprocess
import sys
import time

command = sys.argv[1]
command_check = command.split("/")[-1]

subprocess.Popen(["/bin/bash", "-c", command])

t = 1
while t < 30:
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
        proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split()
        match = sum([[l[0] for l in w_list if p in l] for p in proc], [])
        subprocess.Popen(["wmctrl", "-ic", match[0]])
        break
    except (IndexError, subprocess.CalledProcessError):
        pass
    t += 1
    time.sleep(1)

如何使用

  • 该脚本需要wmctrl

      sudo apt-get install wmctrl
    
  • 将脚本复制到一个空文件中,另存为run_intray.py

  • 测试运行脚本,以应用程序作为参数,例如transmission

      python3 /path/to/run_intray.py transmission-gtk
    
  • 如果一切正常,您可以将其添加到启动应用程序,但请注意您很可能需要在命令前添加一个小中断,以便桌面先完全建立起来:

      /bin/bash -c "sleep 15 && python3 /path/to/run_intray.py transmission-gtk"
    

相关内容