跳转至

控制窗口状态问题

最近在做PM的时候遇到一个需求,需要将打开的程序最小化,通过查阅资料,发现看似简单的问题并不是那么简单

通过win32con控制显示状态

有一些程序可以在通过subprocess运行的时候就可以控制显示状态,代码如下:

Python
import subprocess
import win32con
startinfo = subprocess.STARTUPINFO()
startinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startinfo.wShowWindow = win32con.SW_MINIMIZE
process = subprocess.Popen(r"C:\software\test.exe",startupinfo=startinfo)
通过win32con的方案,在通过subprocess启动的时候就可以以最小化的方式启动

通过Windows API控制显示状态

然而,能按照以上这种方案启动的程序并不多,比如有些窗口是自绘的,并且没有做好窗口事件,或者虽然使用的是原生窗口,但是并不是标准的原生窗口状态,这种时候就容易出现以上的方案失效的情况,这种情况下只能通过Windows API来实现,下面是代码示例:

Python
import ctypes
import time
import subprocess
subprocess.Popen(r'C:\software\test.exe')
user32 = ctypes.WinDLL('user32', use_last_error=True)
time.sleep(1) # 经过测试,如果这里不加入1秒的缓冲,会导致无法正确最小化窗口
hwnd = user32.FindWindowW(None, 'xxx')
if hwnd:
    user32.ShowWindow(hwnd, win32con.SW_MINIMIZE)
其实这个方案也不是最优解,如果仔细研究会发现两个问题: 1. 不能在调用subprocess的时候就让窗口最小化 2. 如果程序的窗口标题不固定就容易失效

对于第二个问题也有缓解的方案,通过询问GPT,它推荐使用pygetwindow来获取窗口句柄,当然由于时间有限,我还没有测试,如果你感兴趣可以试试看