缘起
近期想要制作让gui窗口随着窗口的切换随着切换关闭的效果,翻出了窗口钩子的例子测试发现存在一些问题,对例子进行了改写
比如我想让gui随着非tc窗口的激活关闭而关闭
发现使用例子的写法可能不生效的情况
原写法
原因
调用办法
show_hook: ;add windows hook
Gui, ss:show, AutoSize x%xpos% y%ypos%
Gui ss:+LastFound
hWnd := WinExist()
DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
return
给出一个错误的调用方法
ShellMessage( wParam,lParam ) {
WinGetClass, cls, A
if( cls != "TTOTAL_CMD" ){
gosub Gui_Destroy
}
WinActivate, % "ahk_class " cls
}
解释
我一开始就是这样调用的,为什么说这是个错误的调用方法呢?因为这个没有筛选返回的值,无论返回什么值都执行函数,导致钩子十分敏感
所以需要限定接受的参数
shellMessage(wParam, lParam) { ;接受系统窗口回调消息, 第一次是实时,第二次是保障
If ( wParam=1 || wParam=32772 || wParam=5 || wParam=4) {
WinGetClass, cls, A
if( cls != "TTOTAL_CMD" )
gosub Gui_Destroy
}
}
参数选择可以自行参考
;活动窗口切换监控【异步触发】
/* wParam参数:
;1 顶级窗体被创建 ;2 顶级窗体即将被关闭 ;54 退出全屏 ;32772 窗口切换
;3 SHELL 的主窗体将被激活 ;4 顶级窗体被激活 ;&H8000& 掩码 ;53 全屏
;5 顶级窗体被最大化或最小化 ;6 Windows 任务栏被刷新,也可以理解成标题变更
;7 任务列表的内容被选中 ;8 中英文切换或输入法切换 ;13 wParam=被替换的顶级窗口的hWnd
;9 显示系统菜单 ;10 顶级窗体被强制关闭 ;14 wParam=替换顶级窗口的窗口hWnd
;12 没有被程序处理的APPCOMMAND。见WM_APPCOMMAND
*/
这样就能实现完美切换
效果
大佬牛逼?