You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python+Windows11实现固定浏览器窗口名称,刷新不重置(仿Edge/Chrome)

问题分析

你当前的代码只是一次性修改窗口标题,但Chrome/Edge在页面加载、刷新、导航时会主动通过WM_SETTEXT消息更新窗口标题,覆盖你设置的自定义名称。要实现和浏览器原生重命名一样的固定效果,需要拦截浏览器的标题更新请求。

解决方案(Python + Windows 11)

可以通过Windows API的窗口子类化技术,拦截浏览器窗口的WM_SETTEXT消息,阻止浏览器自行修改标题,从而固定自定义名称。无需键鼠模拟,完全通过系统API实现。

步骤1:依赖安装

先安装pywin32库(封装了Windows API,比纯ctypes更易用):

pip install pywin32

步骤2:实现代码

import pygetwindow as gw
import subprocess
import time
import win32api
import win32gui
import win32con

# 全局变量保存自定义标题和原窗口消息处理函数
_custom_title = ""
_original_window_proc = None

def _hooked_window_proc(hwnd, msg, wparam, lparam):
    """被替换的窗口消息处理函数,拦截标题更新"""
    global _custom_title, _original_window_proc
    
    # 拦截浏览器修改标题的消息
    if msg == win32con.WM_SETTEXT:
        # 强制设置为自定义标题,不执行浏览器的修改请求
        win32api.SetWindowText(hwnd, _custom_title)
        return 0  # 返回0表示消息已处理,不传递给原函数
    
    # 窗口销毁时恢复原消息处理函数,避免内存泄漏
    elif msg == win32con.WM_DESTROY:
        win32gui.SetWindowLongPtr(hwnd, win32con.GWLP_WNDPROC, _original_window_proc)
    
    # 其他消息正常传递给原处理函数
    return win32gui.CallWindowProc(_original_window_proc, hwnd, msg, wparam, lparam)

def open_and_lock_browser_title(url: str, custom_title: str, browser_path: str):
    """打开浏览器并锁定窗口标题"""
    global _custom_title, _original_window_proc
    _custom_title = custom_title
    
    # 记录打开前的所有窗口标题
    windows_before = set(gw.getAllTitles())
    
    # 启动浏览器新窗口
    subprocess.Popen([browser_path, '--new-window', url])
    # 等待窗口创建(时间可根据机器性能调整)
    time.sleep(2)
    
    # 定位新创建的浏览器窗口
    windows_after = set(gw.getAllTitles())
    new_windows = windows_after - windows_before
    if not new_windows:
        print("未找到新创建的浏览器窗口")
        return
    
    new_window_title = list(new_windows)[0]
    target_window = gw.getWindowsWithTitle(new_window_title)[0]
    hwnd = target_window._hWnd
    
    # 初始化设置自定义标题
    win32api.SetWindowText(hwnd, _custom_title)
    
    # 子类化窗口,替换消息处理函数
    _original_window_proc = win32gui.SetWindowLongPtr(hwnd, win32con.GWLP_WNDPROC, _hooked_window_proc)
    print(f"窗口标题已锁定为:{custom_title}")

# 示例:锁定Edge浏览器标题
edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
open_and_lock_browser_title("https://www.google.com/", "我的自定义工作窗口", edge_path)

# 保持程序运行(否则子类化会失效)
win32gui.PumpMessages()

关键说明

  1. 消息拦截原理:通过SetWindowLongPtr替换浏览器窗口的消息处理函数,拦截WM_SETTEXT(窗口标题修改)消息,强制用自定义标题覆盖,阻止浏览器的更新操作。
  2. 浏览器路径适配
    • Edge 64位路径:C:\Program Files\Microsoft\Edge\Application\msedge.exe
    • Chrome路径:C:\Program Files\Google\Chrome\Application\chrome.exe
  3. 程序运行要求:必须保持Python程序处于运行状态,一旦关闭,浏览器会恢复默认的标题更新行为。
  4. 窗口销毁处理:在窗口关闭时恢复原消息处理函数,避免系统资源泄漏。

内容的提问来源于stack exchange,提问作者Digital Farmer

火山引擎 最新活动