是否可以通过 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)
如何使用
该脚本同时使用了
xdotool
和wmctrl
:sudo apt-get install wmctrl xdotool
将脚本复制到一个空文件中,另存为
get_wlist.py
使用以下命令运行它:
python3 /path/to/get_wlist.py <pid>
程序说明
要操作、移动或关闭窗口,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>
升起窗户。