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
まとめ
いずれの方法でも、アクティブなウィンドウのパスと名前簡単に取得することができました。
個別のアプリに対して監視がしたい場合、まずはアプリを特定することから始まるので、そのための第一歩としてこの方法は役立つのではないかと思います。