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

AHK标题栏隐藏脚本优化求助:排除指定程序后脚本失效

问题排查与解决方案

原脚本通过Shell Hook监听新窗口创建,可移除所有窗口标题栏,但需排除特定程序(如Notepad.exe)。修改后的脚本完全失效,原因及修复方案如下:

失效原因分析

  1. 硬编码消息ID不可靠:直接使用0xC028作为SHELLHOOK消息ID错误,该值需通过DllCall("RegisterWindowMessage", "Str", "SHELLHOOK")动态获取,不同系统环境下此值可能不同。
  2. Hook注册窗口句柄错误:修改版用A_ScriptHwnd注册Hook,但该句柄对应的窗口未被设置为可接收Shell Hook消息的窗口;原脚本中Gui +LastFound创建隐藏GUI并设为当前窗口,这是Hook正常工作的核心前提。
  3. 缺失退出反注册逻辑:虽不直接导致失效,但会造成系统资源泄漏,原脚本的OnExit处理逻辑不可省略。

修复后的脚本(基于原脚本添加排除逻辑)

直接在原有效脚本的窗口处理函数中加入排除判断,保留原脚本的可靠结构:

#Persistent
#SingleInstance Force

Gui +LastFound
OnExit("DeregisterShellHook")
DllCall("RegisterShellHookWindow", "ptr", WinExist())
shellHookMsg := DllCall("RegisterWindowMessage", "Str", "SHELLHOOK")
OnMessage(shellHookMsg, Func("OnWindowCreated"))
Return

OnWindowCreated(wParam, hwnd)
{
    ; 仅处理新窗口创建事件(wParam=1对应HSHELL_WINDOWCREATED)
    If (wParam != 1)
        Return
    
    ; 获取窗口所属进程的可执行文件名
    WinGet, exeName, ProcessName, ahk_id %hwnd%
    
    ; 排除指定程序(可通过||添加多个需要排除的.exe文件名)
    If (exeName = "Notepad.exe" || exeName = "TargetApp.exe")
        Return
    
    ; 移除标题栏样式(最大裁剪效果)
    WinSet, Style, -0xc40000, ahk_id %hwnd%
}

DeregisterShellHook()
{
    DllCall("DeregisterShellHookWindow", "ptr", WinExist())
}

关键修改说明

  • 保留原脚本的Gui +LastFound和动态获取消息ID逻辑,确保Shell Hook能正常触发。
  • 在窗口处理函数中新增进程名判断,遇到需排除的程序时直接返回,不执行标题栏移除操作。
  • 支持多程序排除,用||连接多个.exe文件名即可。

验证方法

运行脚本后,打开记事本(Notepad.exe)窗口标题栏会保留;打开其他程序(如计算器),标题栏会被自动移除,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:37:28