web-dev-qa-db-ja.com

プロセスにウィンドウがあるかどうかを判断し、続いてそれを表示、非表示、または閉じるにはどうすればよいですか?

PIDを持っていると仮定して、シェルスクリプトまたはターミナルコマンドを使用して、メインウィンドウ(フォーム)があるかどうかを判断し、それに関する情報(タイトル)を取得して表示/非表示/閉じることができますか?

2
TheRyan722

指定された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>
    

手順の説明


xdotool および wmctrlについて

ウィンドウを操作、移動、または閉じるために、Linuxにはxdotoolwmctrlの2つの重要なツールがあります。これらの2つの中で、xdotoolはおそらく最も堅牢なものであり、一般的にはこれが好みです。両方のツールのオプションは重複していますが、互いに補完し合っています。ウィンドウlistを作成するには、単に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>
    

    ウィンドウを上げます。

1
Jacob Vlijm