如何用Python在Windows 11中从系统托盘打开程序并解决FindWindow返回0问题
解决托盘程序FindWindow返回0并触发加载后关闭的问题
需求
开机时触发隐藏在系统托盘的键盘软件(CMS.exe),使其完成当前键盘布局加载后自动关闭程序。
问题
当程序仅驻留在系统托盘、未显示主窗口时,win32gui.FindWindow返回0,无法通过ShowWindow唤醒程序,导致无法触发布局加载逻辑。
原因
FindWindow仅能查找顶层可见窗口,而托盘程序的主窗口通常处于隐藏状态(或窗口标题与预期不符),因此无法通过标题直接定位。
解决方案
通过枚举系统所有窗口,匹配目标进程的PID来获取窗口句柄,即使窗口处于隐藏状态也能找到。核心步骤:
- 遍历进程找到目标进程的PID
- 枚举所有顶层窗口,通过窗口所属PID匹配目标进程
- 对找到的窗口执行显示操作,触发加载逻辑
- 等待加载完成后终止进程
修改后的代码
from time import sleep import psutil import win32gui import win32con def get_hwnd_by_pid(target_pid): hwnd_list = [] def callback(hwnd, extra): pid = win32gui.GetWindowThreadProcessId(hwnd)[1] if pid == extra: hwnd_list.append(hwnd) win32gui.EnumWindows(callback, target_pid) return hwnd_list def trigger_and_close(task_name): for proc in psutil.process_iter(): if proc.name() == task_name: target_pid = proc.pid # 获取该进程所有窗口句柄 hwnds = get_hwnd_by_pid(target_pid) if hwnds: # 对每个窗口执行显示操作,确保触发加载逻辑 for hwnd in hwnds: win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) sleep(10) # 等待布局加载完成,可根据实际情况调整时长 proc.kill() else: print(f"未找到进程{task_name}的窗口句柄") # sleep(240) # 开机延迟执行,按需启用 trigger_and_close("CMS.exe")
代码说明
get_hwnd_by_pid函数:通过EnumWindows枚举系统所有窗口,对比每个窗口所属进程的PID,收集目标进程的所有窗口句柄trigger_and_close函数:找到目标进程后,获取其窗口句柄并执行显示操作,等待加载完成后终止进程- 遍历所有窗口执行显示,避免遗漏程序的隐藏窗口,确保触发加载逻辑
内容的提问来源于stack exchange,提问作者Shimis
相关产品推荐
相关产品推荐

