AHK标题栏隐藏脚本优化求助:排除指定程序后脚本失效
问题排查与解决方案
原脚本通过Shell Hook监听新窗口创建,可移除所有窗口标题栏,但需排除特定程序(如Notepad.exe)。修改后的脚本完全失效,原因及修复方案如下:
失效原因分析
- 硬编码消息ID不可靠:直接使用
0xC028作为SHELLHOOK消息ID错误,该值需通过DllCall("RegisterWindowMessage", "Str", "SHELLHOOK")动态获取,不同系统环境下此值可能不同。 - Hook注册窗口句柄错误:修改版用
A_ScriptHwnd注册Hook,但该句柄对应的窗口未被设置为可接收Shell Hook消息的窗口;原脚本中Gui +LastFound创建隐藏GUI并设为当前窗口,这是Hook正常工作的核心前提。 - 缺失退出反注册逻辑:虽不直接导致失效,但会造成系统资源泄漏,原脚本的
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
相关产品推荐
相关产品推荐

