找回密码
 加入
搜索
查看: 6988|回复: 9

[AU3基础] [已解决]学习GUIRegisterMsg和window消息代码管理的时候 遇到困难 求助

  [复制链接]
发表于 2014-6-10 11:11:58 | 显示全部楼层 |阅读模式
本帖最后由 cumtljj 于 2014-6-10 17:53 编辑

Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $k = 0
$Gui = GUICreate("WM_ACTIVATE", 550, 140)
GUICtrlCreateLabel('活动窗口发生 WM_ACTIVATE 消息 (最小化, 其它窗口激活).', 5, 5, 360, 130)
GUISetState()
GUIRegisterMsg(0x0006, "WM_ACTIVATE")
Do
Until GUIGetMsg() = -3
Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
    Local $Active, $Minimized
    $Active = BitAND($wParam, 0xFFFF) ; _WinAPI_LoWord 低位字
    $Minimized = BitShift($wParam, 16) ; _WinAPI_HiWord 高位字
    $k += 1
    If $Minimized Then
        ToolTip('最小化 = ' & $lParam, Default, Default, '最小化', 1, 4 + 1)
    Else
        ToolTip('')
    EndIf
    WinSetTitle($Gui, '', '调用次数: ' & $k & '  标志: 激活 = ' & $Active & ', 最小化 = ' & $Minimized)
EndFunc


第十一行的四个参数中$wParam, $lParam 应该是由
WM_ACTIVATE 这一个系统消息获得的 但是前两个是怎么获得的呢 在整个代码中也没有为其赋值 它就怎么知道我操作的就是哪一个窗口了呢?
 楼主| 发表于 2014-6-10 12:02:26 | 显示全部楼层
自己顶上去啊
发表于 2014-6-10 12:45:27 | 显示全部楼层
WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)是由GUIRegisterMsg(0x0006, "WM_ACTIVATE")注册的
所以
1、$hWnd必定是你的程序中的窗体句柄,如果你的程序中有多个窗体,你应该在函数中加以判断
2、$Msg一定等于0x0006,因为GUIRegisterMsg(0x0006, "WM_ACTIVATE")就是当有0x0006消息时,让WM_ACTIVATE函数处理
 楼主| 发表于 2014-6-10 13:12:38 | 显示全部楼层
回复 3# seniors


    你这么一说我恍然大悟 但是对于你是的第一点中的多窗口的话那如何进行判断呢?谢谢
发表于 2014-6-10 15:55:00 | 显示全部楼层
Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $k = 0, $j = 0
$Gui = GUICreate("WM_ACTIVATE", 550, 140, 200, 100)
GUICtrlCreateLabel('活动窗口发生 WM_ACTIVATE 消息 (最小化, 其它窗口激活).', 5, 5, 360, 130)
GUISetState()
$Gui2 = GUICreate("WM_ACTIVATE2", 550, 140, 200, 300)
GUICtrlCreateLabel('活动窗口发生 WM_ACTIVATE 消息 (最小化, 其它窗口激活).', 5, 5, 360, 130)
GUISetState()
GUIRegisterMsg(0x0006, "WM_ACTIVATE")
Do
Until GUIGetMsg() = -3
Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
    Local $Active, $Minimized
    $Active = BitAND($wParam, 0xFFFF) ; _WinAPI_LoWord 低位字
    $Minimized = BitShift($wParam, 16) ; _WinAPI_HiWord 高位字
        Switch $Active
                Case $WA_ACTIVE
                        $out = " 通过鼠标以外的工具(如键盘)激活了该窗口"
                Case $WA_CLICKACTIVE
                        $out = " 鼠标激活窗口"
                Case  $WA_INACTIVE
                        $out = " 取消窗口激活"
        EndSwitch
        
    If $hWnd = $Gui Then 
                $k += 1
                WinSetTitle($Gui, '', '窗口一调用次数: ' & $k & $out)
        EndIf
        If $hWnd = $Gui2 Then 
                $j += 1
                WinSetTitle($Gui2, '', '窗口二调用次数: ' & $j & $out)
        EndIf
EndFunc

评分

参与人数 1金钱 +10 收起 理由
cumtljj + 10

查看全部评分

 楼主| 发表于 2014-6-12 09:42:21 | 显示全部楼层
回复 3# seniors
你好 我现在又有了一个问题,希望你能再帮我看看, 如果按你说的 $hWnd 和$lParam 的返回值都应该是窗口句柄 只不过$lParam是由WM_ACTIVATE系统消息获得的,我测试了一下 这两个值为什么不一样呢?实际测试的时候$lParam每次都会变的 这又是为什么呢?

测试代码如下:
Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $k = 0
$Gui = GUICreate("WM_ACTIVATE", 550, 140)
GUICtrlCreateLabel('活动窗口发生 WM_ACTIVATE 消息 (最小化, 其它窗口激活).', 5, 5, 360, 130)
GUISetState()
GUIRegisterMsg(163, "WM_ACTIVATE")
Do
Until GUIGetMsg() = -3
Func WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
   MsgBox(0,"",$hWnd&@CRLF&$lParam)
EndFunc
163——表示的是点击窗口非客户区
发表于 2014-6-12 10:06:23 | 显示全部楼层
163——表示的是双击非客户区
一般这样写GUIRegisterMsg(163, "WM_NCLBUTTONDBLCLK")
WM_NCLBUTTONDBLCLK消息的$lParam是鼠标双击时的屏幕坐标,不是窗口句柄了
 楼主| 发表于 2014-6-12 11:47:22 | 显示全部楼层
回复 7# seniors


    即使是WM_ACTIVATE 这个系统消息的话如果点最小化 $hWnd和$lParam也不一样啊 $lParam这个在帮助里解释的是窗口句柄的啊
发表于 2014-6-12 12:09:54 | 显示全部楼层
找到原因,WM_ACTIVATE消息的lPARAM值,如果你的程序是单窗口的话,lPARAM是空
如果是多窗口的则:
如果wPARAM值为$WA_INACTIVE;则lPARAM值是要激活窗口的句柄
如果wPARAM值为$WA_ACTIVE或$WA_CLICKACTIVE;则lPARAM值是要取消激活窗口的句柄
 楼主| 发表于 2014-6-12 12:53:52 | 显示全部楼层
回复 9# seniors


   谢谢指点
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 21:30 , Processed in 0.086184 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表