如何获取Windows指定坐标窗口的.exe路径等静态标识符以稳定识别程序?
解决方案:静态识别窗口所属程序的方法
获取窗口对应的.exe路径(完全可行)
你需求的通过窗口获取对应.exe路径的方案是可行的,且完全符合你“仅移动可执行文件时才会变化”的静态识别要求。可以通过窗口句柄→进程ID→进程exe路径的流程实现,以下是Python环境下的具体实现:
首先安装依赖库:
pip install pywin32 psutil
核心代码示例:
import win32gui import win32process import psutil def get_window_exe_path(hwnd): # 从窗口句柄获取对应进程ID pid = win32process.GetWindowThreadProcessId(hwnd)[1] if pid == 0: return None try: # 通过PID获取进程对象,提取exe路径 process = psutil.Process(pid) return process.exe() except (psutil.NoSuchProcess, psutil.AccessDenied): # 处理无权限或进程已结束的情况 return None # 示例:获取鼠标当前指向窗口的exe路径 def get_mouse_target_window_exe(): cursor_pos = win32gui.GetCursorPos() target_hwnd = win32gui.WindowFromPoint(cursor_pos) return get_window_exe_path(target_hwnd) # 测试调用 print(get_mouse_target_window_exe())
该方法的稳定性很高,exe路径仅在程序文件被移动、重装或替换时才会改变,完全满足你的静态识别需求。
其他静态识别程序的备选方法
如果遇到少数特殊场景(如绿色版程序被复制到多个路径),还可以使用以下静态标识:
程序版本信息(产品名/公司名):多数正规软件的exe文件会包含固定的产品名称、公司名称等版本信息,不会随路径或运行状态变化。通过psutil可以直接读取:
def get_process_static_info(pid): try: process = psutil.Process(pid) version_data = process.version_info() return { "产品名称": version_data.get("ProductName"), "公司名称": version_data.get("CompanyName") } except (psutil.NoSuchProcess, psutil.AccessDenied): return None窗口类名:很多程序的窗口类名是固定的,比如Chrome浏览器的主窗口类名为
Chrome_WidgetWin_1,系统记事本为Notepad。可以通过win32gui直接获取:cursor_pos = win32gui.GetCursorPos() target_hwnd = win32gui.WindowFromPoint(cursor_pos) window_class = win32gui.GetClassName(target_hwnd) print(window_class)数字签名信息:对于经过正规数字签名的软件,其exe文件的签名发行人、序列号等信息是固定的,可作为唯一标识。不过实现相对复杂,需要调用Windows系统API解析签名内容。
内容的提问来源于stack exchange,提问作者Pomacanthidae
相关产品推荐
相关产品推荐

