如何确定某个进程是否有窗口,然后显示、隐藏或关闭它?

如何确定某个进程是否有窗口,然后显示、隐藏或关闭它?

是否可以通过 shell 脚本或终端命令,假设您有 PID,确定它是否有主窗口(表单),然后获取有关它的信息(标题)并显示/隐藏/关闭它?

答案1

脚本查找给定 pid 的可能窗口,然后显示、最小化或关闭它

由于您提到了命令行,因此下面的脚本将在终端窗口中运行。您可以使用作为pid参数来运行它,例如:

python3 /path/to/script.py 1234

随后,出现一个窗口(列表),您可以在其中选择一个(列表)数字并键入要在其上执行的选项:

Current Windows for pid 2189:
------------------------------------------------------------
[1] Niet-opgeslagen document 1 - gedit
[2] testbackup.py (~/Bureaublad) - gedit

------------------------------------------------------------
Type window number + option:
-k  [kill (gracfully)]
-m  [minimize]
-s  [show]
Press <Enter> to cancel
------------------------------------------------------------
1 -k

如果没有窗户:

There are no windows for pid 1234

剧本

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

pid = sys.argv[1]

message = """
------------------------------------------------------------
Type window number + option:
-k  [kill (gracfully)]
-m  [minimize]
-s  s[how]
<Enter> to cancel
------------------------------------------------------------
"""
# just a helper function
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
# get the window list
wlist = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if pid in l]
# create a indexed list of window name, id
wdata = [[i+1, get(["xdotool", "getwindowname", w_id]), w_id] \
         for i, w_id in enumerate(wlist)]

# if the list is not empty (windows exist)
if wdata:
    # print the window list
    print("\nCurrent Windows for pid "+pid+":\n"+"-"*60)
    for item in wdata:
        print("["+str(item[0])+"]", item[1])
    # ask for user input (see "message" at the top)
    action = input(message)
    action = action.split()
    # run the chosen action
    try:
        subj = [item[2] for item in wdata if item[0] == int(action[0])][0]
        options = ["-k", "-m", "-s"]; option = options.index(action[1])
        command = [
            ["wmctrl", "-ic", subj],
            ["xdotool", "windowminimize", subj],
            ["wmctrl", "-ia", subj],
            ][option]
        subprocess.Popen(command)    
    except (IndexError, ValueError):
        pass
else:
    print("There are no windows for pid", pid)

如何使用

  1. 该脚本同时使用了xdotoolwmctrl

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

  3. 使用以下命令运行它:

    python3 /path/to/get_wlist.py <pid>
    

程序说明


关于工具控制端

要操作、移动或关闭窗口,Linux 上有两个重要的工具:xdotoolwmctrl。在这两个工具中,xdotool可能是最强大的一个,我一般更喜欢它。虽然这两个工具的选项重叠,但它们确实相互补充,并且要创建一个窗口列表我们只是需要wmctrl

因此,大多数情况下,我最终都会使用这两种工具的混合体。


脚本的作用:

  • 该脚本获取当前打开的窗口列表,使用以下命令:

    wmctrl -lp
    

    它为我们提供了有关窗口 id 及其所属 pid 的信息,输出如下:

    0x05a03ecc  0 2189   jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
    
  • 然后,脚本过滤出属于相应 pid 的窗口,并使用以下命令查找窗口名称xdotool

    xdotool getwindowname <window_id>
    

    并显示找到的窗口按名字. 在引擎盖下,这些窗户是编号

  • 随后,如果用户输入一个数字+一个选项,则会在所选窗口上执行相应的操作:

    wmctrl -ic <window_id>
    

    优雅地关闭窗口,或者

    xdotool windowminimize <window_id>
    

    最小化所选窗口,或

    wmctrl -ia <window_id>
    

    升起窗户。

相关内容