Files
upstream-mirror 8e9cceaeae
Some checks failed
Build / test on ubuntu-latest (py-3.9) (push) Failing after 2m36s
Build / typecheck (push) Successful in 1m38s
Build / test on macos-latest (py-3.9) (push) Has been cancelled
Build / test on windows-latest (py-3.9) (push) Has been cancelled
CodeQL / Analyze (python) (push) Failing after 1s
snapshot of https://github.com/ActivityWatch/aw-watcher-window.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 00:21:37 +05:00

90 lines
2.0 KiB
Python

import os
import time
from typing import Optional
import win32api
import win32gui
import win32process
import wmi
def get_app_path(hwnd) -> Optional[str]:
"""Get application path given hwnd."""
path = None
_, pid = win32process.GetWindowThreadProcessId(hwnd)
process = win32api.OpenProcess(
0x0400, False, pid
) # PROCESS_QUERY_INFORMATION = 0x0400
try:
path = win32process.GetModuleFileNameEx(process, 0)
finally:
win32api.CloseHandle(process)
return path
def get_app_name(hwnd) -> Optional[str]:
"""Get application filename given hwnd."""
path = get_app_path(hwnd)
if path is None:
return None
return os.path.basename(path)
def get_window_title(hwnd):
return win32gui.GetWindowText(hwnd)
def get_active_window_handle():
hwnd = win32gui.GetForegroundWindow()
return hwnd
# WMI-version, used as fallback if win32gui/win32process/win32api fails (such as for "run as admin" processes)
c = wmi.WMI()
"""
Much of this derived from: http://stackoverflow.com/a/14973422/965332
"""
def get_app_name_wmi(hwnd) -> Optional[str]:
"""Get application filename given hwnd."""
name = None
_, pid = win32process.GetWindowThreadProcessId(hwnd)
for p in c.query("SELECT Name FROM Win32_Process WHERE ProcessId = %s" % str(pid)):
name = p.Name
break
return name
def get_app_path_wmi(hwnd) -> Optional[str]:
"""Get application path given hwnd."""
path = None
_, pid = win32process.GetWindowThreadProcessId(hwnd)
for p in c.query(
"SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = %s" % str(pid)
):
path = p.ExecutablePath
break
return path
if __name__ == "__main__":
while True:
hwnd = get_active_window_handle()
print("Title:", get_window_title(hwnd))
print("App: ", get_app_name(hwnd))
print("App (wmi): ", get_app_name_wmi(hwnd))
print("Path: ", get_app_path(hwnd))
print("Path (wmi): ", get_app_path_wmi(hwnd))
time.sleep(1.0)