Как я могу определить, имеет ли процесс окно, и впоследствии покажите, скройте или закройте его?

Действительно ли это возможно, или через сценарий оболочки или через терминальную команду, предполагая, что Вы имеете PID, определяете, имеет ли это главное окно (форма), и затем получите информацию об этом (заголовок) и покажите/скройте/закройте его?

2
задан 3 February 2016 в 00:33

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. Сценарий использует обоих xdotool и wmctrl:

    sudo apt-get install wmctrl xdotool
    
  2. Скопируйте сценарий в пустой файл, сохраните его как get_wlist.py

  3. Выполните его с командой:

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

Объяснение на процедуре


О xdotool и wmctrl:

Для управления переместите или закройте окна, на Linux существует два важных инструмента: xdotool и wmctrl. Из этих двух, xdotool вероятно, самый устойчивый, который я предпочитаю в целом. Хотя опции обоих перекрытий инструментов, они действительно завершают друг друга однако, и создать список окна нам просто нужно wmctrl.

В большинстве случаев поэтому я заканчиваю тем, что использовал смесь обоих инструментов.


Что делает сценарий:

  • Сценарий получает в настоящее время открываемый список окна, с помощью команды:

    wmctrl -lp
    

    Который дает нам информацию и об идентификаторе окна и о 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>
    

    повысить окно.

1
ответ дан 2 December 2019 в 04:59

Другие вопросы по тегам:

Похожие вопросы: