【Python】アクティブウィンドウのアプリ名とパスを取得する(Windows)

6/04/2023

Python Windows

t f B! P L

WindowsでPythonを使って、アクティブウィンドウのソフト名とフルパスを取得する機会があったので、ほぼstackoverflowのコピペですが、備忘録として記事にします。

方法は調べた限りだとpywin32のみを使う方法が多いようでしたが、コードが複雑になりがちなのとn番煎じになってしまうので、wmiもしくはpsutilを使って楽をする方法を解説します。

準備

いずれにせよ、pywin32は必要になるのでインストールしておきます。

pip install pywin32

wmiを使う

PyPi: https://pypi.org/project/WMI/
GitHub: https://github.com/tjguk/wmi

インストール

pip install wmi

コード

WMIを使って一秒ごとにアクティブウィンドウの名前とパスを表示するプログラムの例です。

import win32process
import win32gui
import wmi
from time import sleep

c = wmi.WMI()

def get_app_path(hwnd):
    try:
        _, pid = win32process.GetWindowThreadProcessId(hwnd)
        for p in c.query(f'SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = {str(pid)}'):
            exe = p.ExecutablePath
            break
    except:
        return None
    else:
        return exe


def get_app_name(hwnd):
    try:
        _, pid = win32process.GetWindowThreadProcessId(hwnd)
        for p in c.query(f'SELECT Name FROM Win32_Process WHERE ProcessId = {str(pid)}'):
            exe = p.Name
            break
    except:
        return None
    else:
        return exe
    
    
print("\n1秒ごとにアクティブなアプリケーションのパスと名前を表示します。\n")
while(True):
    hwnd = win32gui.GetForegroundWindow()
    print(get_app_path(hwnd))
    print(get_app_name(hwnd))
    sleep(1)

出力例:

1秒ごとにアクティブなアプリケーションのパスと名前を表示します。

C:\Windows\System32\cmd.exe
cmd.exe
C:\WINDOWS\Explorer.EXE
explorer.exe
C:\WINDOWS\Explorer.EXE
explorer.exe

psutilを使う

PyPi: https://pypi.org/project/psutil/
GitHub: https://github.com/giampaolo/psutil

インストール

pip install psutil

コード

psutilを使って一秒ごとにアクティブウィンドウの名前とパスを表示するプログラムの例です。

from time import sleep
import psutil
import win32gui
import win32process
    
while(True):
    hwnd = win32gui.GetForegroundWindow()
    _,pid = win32process.GetWindowThreadProcessId(hwnd)
    process = psutil.Process(pid)
    process_path = process.exe()
    process_name = process.name()
    print("\n1秒ごとにアクティブなアプリケーションのパスと名前を表示します。\n")
    print(process_path)
    print(process_name)
        
    sleep(1)

出力例:

1秒ごとにアクティブなアプリケーションのパスと名前を表示します。

C:\Windows\explorer.exe
explorer.exe
C:\Windows\explorer.exe
explorer.exe
C:\Program Files\Mozilla Firefox\firefox.exe
firefox.exe

まとめ

いずれの方法でも、アクティブなウィンドウのパスと名前簡単に取得することができました。

個別のアプリに対して監視がしたい場合、まずはアプリを特定することから始まるので、そのための第一歩としてこの方法は役立つのではないかと思います。