Como posso determinar se um processo tem uma janela e, em seguida, mostrar, ocultar ou fechá-lo?

2

É possível, seja através de um script de shell ou terminal, supondo que você tenha o PID, determine se ele tem uma janela principal (formulário) e, em seguida, obtenha informações sobre ele (title) e mostre / oculte / feche?

    
por TheRyan722 02.02.2016 / 00:59

1 resposta

2

Script para procurar a (s) janela (s) possível (s) do dado pid, depois mostrar, minimizar ou fechá-lo

Como você mencionou a linha de comando, o script abaixo é executado em uma janela de terminal. Você o executa com o pid como argumento, por exemplo:

python3 /path/to/script.py 1234

Posteriormente, uma janela (lista) aparece, da qual você pode escolher um número (lista-) e digitar uma opção para executar nele:

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

Se não houver janelas:

There are no windows for pid 1234

O script

#!/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)

Como usar

  1. O script usa xdotool e wmctrl :

    sudo apt-get install wmctrl xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como get_wlist.py

  3. Execute-o com o comando:

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

Explicação sobre o procedimento

Sobre xdotool e wmctrl :

Para manipular, mover ou fechar janelas, existem duas ferramentas importantes no Linux: xdotool e wmctrl . Destes dois, xdotool é provavelmente o mais robusto, o que eu prefiro em geral. Embora as opções de ambas as ferramentas se sobreponham, elas se completam e, para criar uma janela list , precisamos apenas de wmctrl .

Na maioria dos casos, portanto, acabo usando uma mistura de ambas as ferramentas.

O que o script faz:

  • O script obtém a lista de janelas abertas no momento, usando o comando:

    wmctrl -lp
    

    O que nos dá informações sobre o id da janela e o pid ao qual ele pertence, com uma saída, parecida com:

    0x05a03ecc  0 2189   jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
    
  • O script então filtra as janelas, pertencentes ao pid correspondente, procura o nome da janela com o comando xdotool :

    xdotool getwindowname <window_id>
    

    e exibe as janelas encontradas por nome . Sob o capô, essas janelas são numeradas .

  • posteriormente, se o usuário digitar um número + uma opção, a ação correspondente será executada na janela escolhida:

    wmctrl -ic <window_id>
    

    para fechar a janela normalmente ou

    xdotool windowminimize <window_id>
    

    para minimizar a janela escolhida ou

    wmctrl -ia <window_id>
    

    para levantar a janela.

por Jacob Vlijm 02.02.2016 / 11:28