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

瑞安722

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

雅各布·弗利姆(Jacob Vlijm)

脚本查找给定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>
    

程序说明


关于xdotoolwmctrl

要操纵,移动或关闭窗口,Linux上有两个重要工具:xdotool和和wmctrl在这两个中,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>
    

    举起窗户。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何确定一个进程是否具有GUI?

我在tkinker中有一个“顶层”按钮,我想关闭窗口,然后执行功能

如何隐藏页面上除一个 div 之外的所有内容,然后在单击按钮后显示它?

如何确定我有一个带有两个线程的进程,还是两个进程?

如何从另一个进程显示WPF窗口

绘制一个简单的图像,显示它,然后关闭它

Win8动画显示了一个屏幕外打开的窗口。我如何找到它?

给定一个hwnd,确定该窗口是否未被其他窗口隐藏(Z排序)

PowerCLI有一个隐藏的vc别名,我无法确定它的来源以及是否还有更多类似的东西

如何找出用ShellExecuteEx创建的进程是否拥有一个窗口?

一个gzip进程定期在我的系统上运行,如何确定是什么触发了它?

如果我运行 tmux 然后“杀死”tmux 进程,我会看到两个 bash 进程。这第二个 bash 与第一个 bash 有什么关系,我该如何杀死它?

如何重新初始化终端窗口,而不是关闭它并启动一个新窗口?

我怎么能在 python 中关闭一个情节然后重新打开它?

我如何使它仅显示一个结果并添加一个随机按钮?

如何打开根窗口,关闭它,然后几秒钟后在tkinter中打开另一个窗口?

使用 Tkinter iwant 打开第二个窗口,然后关闭我所在的前一个窗口

我可以知道我的窗口句柄是否由另一个进程请求吗?

iOS关闭UIAlertView,然后显示另一个

获取第一个隐藏表格并显示它

我有一个角分页器,它在使用 ngIf 显示和隐藏它时停止工作

在pygame中创建一个窗口而不显示它

如何排序一个div的隐藏顺序,然后使用jQuery动画显示另一个div?

设置新的窗口站句柄后,您是否应该关闭进程的前一个窗口站句柄?

jQuery:如何显示文本并隐藏然后显示另一个文本?

如果我有一个指向它的指针,而不是一个迭代器,我如何删除它?

引导模态-隐藏一个然后显示另一个

如何使用angular2一次隐藏和显示一个弹出窗口

显示下一个之前无法隐藏上一个窗口