如何用Python实现基于活动窗口的屏幕分辨率自动切换?
实现窗口活跃时自动切换屏幕分辨率的Python方案
需求说明
- 当指定窗口(如
notepad.exe)处于活跃状态时,将屏幕分辨率切换为1440x1080 - 当其他任意窗口活跃时,自动切回
1920x1080
原代码问题分析
原代码存在以下关键问题:
- tkinter没有
tk.ACTIVE('notepad.exe')这种检测活跃窗口的方法 - 绑定的
<Button-WinExp>是无效的tkinter事件类型 - 缺少持续监测窗口状态的循环逻辑
- 未实现具体的分辨率切换命令
修正后的完整实现
1. 安装依赖库
首先安装用于窗口监测和显示器信息获取的库:
pip install pygetwindow screeninfo
2. 完整代码
import subprocess import tkinter as tk import pygetwindow as gw from screeninfo import get_monitors # 配置参数 TARGET_WINDOW_EXE = "notepad.exe" # 目标窗口进程名 TARGET_WIDTH, TARGET_HEIGHT = 1440, 1080 # 目标分辨率 DEFAULT_WIDTH, DEFAULT_HEIGHT = 1920, 1080 # 默认分辨率 def set_resolution(width, height): """设置屏幕分辨率""" try: # 使用PowerShell命令修改分辨率,需管理员权限 cmd = f"powershell -Command \"Set-DisplayResolution -Width {width} -Height {height} -Force\"" subprocess.run(cmd, shell=True, check=True) print(f"已切换分辨率至 {width}x{height}") except subprocess.CalledProcessError as e: print(f"分辨率切换失败: {e}") def check_active_window(): """持续检测活跃窗口并切换分辨率""" try: active_window = gw.getActiveWindow() if active_window: # 更精准的进程名检测方式(需安装psutil:pip install psutil) # import psutil # pid = active_window._hWnd # process = psutil.Process(pid) # window_exe = process.name().lower() # 临时通过窗口标题判断(如果窗口标题包含进程名) window_title = active_window.title.lower() if TARGET_WINDOW_EXE.lower() in window_title: set_resolution(TARGET_WIDTH, TARGET_HEIGHT) else: set_resolution(DEFAULT_WIDTH, DEFAULT_HEIGHT) except Exception as e: print(f"窗口检测出错: {e}") # 每隔2秒重复检测,不阻塞tkinter主循环 window.after(2000, check_active_window) def start_winexp(): """启动winexp.exe""" # 使用原始字符串避免路径转义问题 subprocess.call([r'C:\Users\VBucks\Workspaces\winexp\winexp.exe']) if __name__ == "__main__": window = tk.Tk() window.title("分辨率自动切换工具") # 创建启动按钮 start_btn = tk.Button( window, text='Start winexp', height=2, width=15, bg='black', fg='white', command=start_winexp ) start_btn.pack(pady=20) # 启动窗口监测循环 check_active_window() window.mainloop()
关键说明
- 窗口监测:使用
pygetwindow获取当前活跃窗口,相比tkinter更适合系统级窗口状态检测 - 分辨率切换:通过PowerShell的
Set-DisplayResolution命令修改分辨率,脚本需以管理员身份运行才能生效 - 循环检测:通过
tkinter的after()方法实现定时检测,不会阻塞GUI主循环 - 进程名检测:如果需要更精准的进程匹配,可以引入
psutil库(代码中已注释相关逻辑)
内容的提问来源于stack exchange,提问作者Jakuqar
相关产品推荐
相关产品推荐

