You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现基于活动窗口的屏幕分辨率自动切换?

实现窗口活跃时自动切换屏幕分辨率的Python方案

需求说明

  • 当指定窗口(如notepad.exe)处于活跃状态时,将屏幕分辨率切换为1440x1080
  • 当其他任意窗口活跃时,自动切回1920x1080

原代码问题分析

原代码存在以下关键问题:

  1. tkinter没有tk.ACTIVE('notepad.exe')这种检测活跃窗口的方法
  2. 绑定的<Button-WinExp>是无效的tkinter事件类型
  3. 缺少持续监测窗口状态的循环逻辑
  4. 未实现具体的分辨率切换命令

修正后的完整实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:54:28