找回密码
 加入
搜索
查看: 1904|回复: 10

[AU3基础] 两个窗口 注册何种消息可以判定是A窗口激活还是B窗口[已解决]

  [复制链接]
发表于 2017-7-5 01:21:19 | 显示全部楼层 |阅读模式
本帖最后由 kk_lee69 于 2017-7-6 00:45 编辑

两个窗口 注册何种消息可以判定是A窗口激活还是B窗口

自己的程序  写了两个窗口  A 跟 B
这时候 可能是 A激活在 B 上面 也可能是B激活在A上面

想注册个函数 谁被激活了 就报备一次
这样我就可以知道 目前的使用者 按下哪个窗口

请问要注册哪个消息呢??
发表于 2017-7-5 12:45:12 | 显示全部楼层
如果是事件模式,@GUI_WinHandle 就是当前激活的窗口句柄
如果是消息模式,
$aArray = GUIGetMsg(1) 
$aArray[0] = 0 或 事件 ID 或 控件 ID
$aArray[1] = 产生事件的窗口句柄
$aArray[2] = 产生事件的控件句柄(若适用)
$aArray[3] = 鼠标光标当前 X 坐标(相对于 GUI 窗口)
$aArray[4] = 鼠标光标当前 Y 坐标(相对于 GUI 窗口)
 楼主| 发表于 2017-7-5 13:38:07 | 显示全部楼层
回复 2# yamakawa

不好意思 我有點搞不懂  我怎麼知道  是A 窗口 還是 B窗口

狀況可能有兩個   A 在 B 上方  通常這時候 是 A激活

或者 B 在 A 上方  這時候通常是 B 激活

如何從你的語法知道 A在上面 還是 B ??
发表于 2017-7-5 14:41:45 | 显示全部楼层
本帖最后由 tubaba 于 2017-7-5 15:08 编辑

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <ComboConstants.au3>
Global $GUI1 = GUICreate('A')
Global $GUI2 = GUICreate('B')
GUISetState(@SW_SHOW, $GUI1)
GUISetState(@SW_SHOW, $GUI2)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")

Do


Until GUIGetMsg() = -3


Func WM_ACTIVATE($hWnd, $iMsg, $iwParam, $ilParam)
        Local $fActive = _WinAPI_LoWord($iwParam)
        Local $fMinimized = _WinAPI_HiWord($iwParam)
        If $hWnd = $GUI1 Then
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $GUI1 激活 ' & $GUI1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $fActive = ' & $fActive & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $fMinimized = ' & $fMinimized & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
        ElseIf $hWnd = $GUI2 Then
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $GUI2 激活 ' & $GUI2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $fActive = ' & $fActive & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $fMinimized = ' & $fMinimized & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                
        EndIf
EndFunc   ;==>WM_ACTIVATE


消息: WM_ACTIVATE

参数:
fActive  = LOWORD(wParam);   // activation flag
fMinimized = (BOOL)HIWORD(wParam); // minimized flag
hwndPrevious= (HWND)lParam;   // window handle

fActive 参数表明窗口是被激活还是被取消。该信息保存在 wParam 的低阶字中,可以取以下的值:

WA_CLICKACTIVE       通过鼠标单击激活了该窗口
WA_ACTIVE                   通过鼠标以外的工具(如键盘)激活了该窗口
WA_INACTIVE               取消该窗口的激活

fMinimized 参数表明窗口是否为最小化状态。该信息保存在 wParam 的高阶字中,非0表示最小化,0表示不是最小化

hwndPrevious 参数表示其他窗口句柄,根据fActive参数的不同含义不同,fActive为激活时hwndPrevious表示上一个激活的窗口句柄,

fActive为失去激活时hwndPrevious表示下一个激活的窗口句柄,注意hwndPrevious可能为NULL,

该信息保存在 lParam中。

评分

参与人数 1金钱 +50 收起 理由
kk_lee69 + 50 感謝回復

查看全部评分

发表于 2017-7-5 14:51:08 | 显示全部楼层
回复 3# kk_lee69
    #include <GUIConstantsEx.au3>

Local $hGUIParent1 = GUICreate("Parent1")
GUICtrlCreateLabel("点击鼠标",10,10)
GUISetState(@SW_SHOW)
        
Local $hGUIParent2 = GUICreate("Parent2", -1, -1, 100, 100)
GUICtrlCreateLabel("点击鼠标",10,10)
GUISwitch($hGUIParent2)
GUISetState(@SW_SHOW)

While 1
        local $amsg = GUIGetMsg(1)
        Switch $amsg[0]
        Case  $GUI_EVENT_PRIMARYDOWN 
                                MsgBox(0,"","当前激活窗口是" & WinGetTitle($amsg[1]) & @CRLF)
                Case  $GUI_EVENT_CLOSE
                            MsgBox(0,"","你点击了退出")
                                ExitLoop
     
                EndSwitch

WEnd
不知道是不是这个意思

评分

参与人数 1金钱 +50 收起 理由
kk_lee69 + 50 感謝回復

查看全部评分

 楼主| 发表于 2017-7-5 15:10:16 | 显示全部楼层
回复 4# tubaba


    基本上這是我要的   但是請教一下 我看這個消息 好像是  激活 跟 變成不激活 都會 發送這個消息是嘛??   我本來在想的是 有沒有單純激活才發送  不激活就不發送了

看還好像還得在函數內 判斷誰是激活
发表于 2017-7-5 15:55:37 | 显示全部楼层
是的,在函数内判断$fActive的值
 楼主| 发表于 2017-7-5 16:03:21 | 显示全部楼层
回复 5# yamakawa


   是這個意思  我研究一下  感謝幫助  不過我想請教個問題

你的方法 必須要點選 客戶區的 位置 才會出現 判斷

如果你點選  窗口欄 或者 直接從 工作列 選擇  A或 B 激活

則不會出現判斷  有辦法改善嗎??
 楼主| 发表于 2017-7-5 16:04:04 | 显示全部楼层
回复 7# tubaba


    了解 我在研究一下  感謝 幫忙
发表于 2017-7-5 17:00:09 | 显示全部楼层
本帖最后由 yamakawa 于 2017-7-5 18:13 编辑

回复 9# kk_lee69


    这样的话,确实只能注册消息了。。
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $GUI1 = GUICreate('第一个窗口',300,400,200,500)
Global $GUI2 = GUICreate('第二个窗口',300,400,600,500)
GUISetState(@SW_SHOW, $GUI1)
GUISetState(@SW_SHOW, $GUI2)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
 
Do
        
Until GUIGetMsg() = -3

 
 
Func WM_ACTIVATE($hWnd, $iMsg, $iwParam, $ilParam)
        Local $Activemode = _WinAPI_LoWord($iwParam)

                Switch $Activemode
                        Case 0
                                ;$Activemode = "inactive"
                                Return
                        Case 1
                                $Activemode = "其他方式激活"
                        Case 2
                                $Activemode ="鼠标点击激活"
                EndSwitch
                
        ConsoleWrite("信息" & @CRLF & "当前激活窗口为 :" & WinGetTitle($hWnd) & @CRLF & "激活方式为 :" & $Activemode )

EndFunc
发表于 2017-7-12 01:17:37 | 显示全部楼层
消息注册,学习一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-19 23:13 , Processed in 0.088957 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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