kk_lee69 发表于 2017-7-5 01:21:19

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

本帖最后由 kk_lee69 于 2017-7-6 00:45 编辑

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

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

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

请问要注册哪个消息呢??

yamakawa 发表于 2017-7-5 12:45:12

如果是事件模式,@GUI_WinHandle 就是当前激活的窗口句柄
如果是消息模式,$aArray = GUIGetMsg(1)
$aArray = 0 或 事件 ID 或 控件 ID
$aArray = 产生事件的窗口句柄
$aArray = 产生事件的控件句柄(若适用)
$aArray = 鼠标光标当前 X 坐标(相对于 GUI 窗口)
$aArray = 鼠标光标当前 Y 坐标(相对于 GUI 窗口)

kk_lee69 发表于 2017-7-5 13:38:07

回复 2# yamakawa

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

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

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

如何從你的語法知道 A在上面 還是 B ??

tubaba 发表于 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中。

yamakawa 发表于 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
      Case$GUI_EVENT_PRIMARYDOWN
                                MsgBox(0,"","当前激活窗口是" & WinGetTitle($amsg) & @CRLF)
                Case$GUI_EVENT_CLOSE
                          MsgBox(0,"","你点击了退出")
                                ExitLoop
   
                EndSwitch

WEnd
不知道是不是这个意思

kk_lee69 发表于 2017-7-5 15:10:16

回复 4# tubaba


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

看還好像還得在函數內 判斷誰是激活

tubaba 发表于 2017-7-5 15:55:37

是的,在函数内判断$fActive的值

kk_lee69 发表于 2017-7-5 16:03:21

回复 5# yamakawa


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

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

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

則不會出現判斷有辦法改善嗎??

kk_lee69 发表于 2017-7-5 16:04:04

回复 7# tubaba


    了解 我在研究一下感謝 幫忙

yamakawa 发表于 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

heroxianf 发表于 2017-7-12 01:17:37

消息注册,学习一下。
页: [1]
查看完整版本: 两个窗口 注册何种消息可以判定是A窗口激活还是B窗口[已解决]