如何在启动时运行程序,最小化?

ner*_*itt 24 startup startup-applications minimize xdotool telegram

我只想运行 Telegram,并将其添加到启动应用程序中。关键是我需要将它最小化。有什么命令吗?

Jac*_*ijm 32

最小化启动应用程序

以最小化的方式启动应用程序需要两个命令:

  • 启动应用程序
  • 最小化它的窗口

因此,命令或脚本需要“智能”;第二个命令应该等待应用程序窗口实际出现。

最小化启动应用程序的通用解决方案

下面的脚本可以做到这一点,并且可以用作以最小化方式启动应用程序的通用解决方案。只需在语法中运行它:

<script> <command_to_run_the_application> <window_name>
Run Code Online (Sandbox Code Playgroud)

剧本

<script> <command_to_run_the_application> <window_name>
Run Code Online (Sandbox Code Playgroud)

如何使用

该脚本需要wmctrlxdotool

sudo apt-get install wmctrl xdotool
Run Code Online (Sandbox Code Playgroud)

然后:

  1. 将脚本复制到一个空文件中,另存为 startup_minimizd.py
  2. 使用(例如)gedit命令测试运行脚本:

    python3 /path/to/startup_minimizd.py gedit gedit
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果一切正常,请将命令(针对您的应用程序)添加到 Startup Applications

解释

  • 脚本启动应用程序,运行您作为第一个参数给出的命令
  • 然后脚本检查窗口列表(在 的帮助下wmctrl)是否有以您的第二个参数命名的窗口。
  • 如果窗口出现,它会立即最小化,xdotool 如果窗口由于某种原因可能不出现,为了防止无限循环,脚本将窗口出现的时间限制为 30 秒。

笔记

无需提及您可以一次将脚本用于多个应用程序,因为您使用脚本之外的参数运行它。


编辑

通过 pid 识别窗口

如果窗口标题不确定或可变,或者窗口名称存在名称冲突的风险,则使用pid是更可靠的使用方法。

下面的脚本是基于使用的应用程序的PID,如在两者的输出wmctrl -lpps -ef

设置几乎相同,但在此版本中不需要窗口标题,因此运行它的命令是:

python3 /path/to/startup_minimizd.py <command_to_run_application>
Run Code Online (Sandbox Code Playgroud)

就像第一个脚本一样,它同时需要wmctrlxdotool

剧本

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

subprocess.Popen(["/bin/bash", "-c", sys.argv[1]])
windowname = sys.argv[2]

def read_wlist(w_name):
    try:
        l = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8").splitlines()
        return [w.split()[0] for w in l if w_name in w][0]
    except (IndexError, subprocess.CalledProcessError):
        return None

t = 0
while t < 30:
    window = read_wlist(windowname)
    time.sleep(0.1)
    if window != None:
        subprocess.Popen(["xdotool", "windowminimize", window])
        break
    time.sleep(1)
    t += 1
Run Code Online (Sandbox Code Playgroud)

关于第二个脚本的注意事项

虽然通常第二个版本应该更可靠,但在应用程序由包装脚本启动的情况下,命令的 pid 将与最终调用的应用程序不同。

在这种情况下,我建议使用第一个脚本。



EDIT2 特定版本的 Steam 脚本

根据评论中的要求,在一个版本下面,专门用于启动 STEAM 最小化。

为什么是 Steam 的特定版本?

事实证明,它的Steam行为与“正常”应用程序完全不同:

  • 结果证明Steam不运行一个pid,但不少于(在我的测试中)八个!
  • Steam在启动时运行至少有两个窗口(一个类似飞溅的窗口),但有时会出现一个额外的消息窗口。
  • Steam 的 Windows 有pid 0,这是脚本中的问题,因为它是。
  • 创建主窗口后,窗口会在大约一秒钟后再次升起,因此单个最小化不会起作用。

这种特殊的行为Steam要求脚本的特殊版本,它在下面添加。脚本启动Steam,在 12 秒内,它会留意相应的所有新窗口WM_CLASS,检查它们是否被最小化。如果不是,脚本会确保它们会是。

像原来的剧本,这一个需求wmctrlxdotool安装。

剧本

sudo apt-get install wmctrl xdotool
Run Code Online (Sandbox Code Playgroud)

使用它

  • @fedorqui 很好,可能会发生两个异常:`subprocess.CalledProcesError`(由于有错误的`wmctrl`)和`IndexError`(正常异常)将在一分钟内编辑:)。感谢您提及 (2认同)
  • @JDHolland 我相信它可以修复。将在接下来的几天内在某个地方调查它:) (2认同)

Fra*_*hin 5

最好将 user72216 和 Sergey 提供的脚本作为问题的一般解决方案,但有时您希望最小化的应用程序已经有一个开关可以执行您想要的操作。

下面是一些带有相应启动程序命令字符串的示例:

  • Telegram(从 0.7.10 版本开始)有以下-startintray选项:<path-to-Telegram>/Telegram -startintray
  • Steam 有以下-silent选项:/usr/bin/steam %U -silent
  • 传输有--minimized选项:/usr/bin/transmission-gtk --minimized

在 Unity 中,这些应用程序开始时会最小化为顶部菜单栏中的图标,而不是启动器上的图标,但一旦您开始使用该应用程序,正常的启动图标仍会出现。其他应用程序的行为可能有所不同。