找回密码
 加入
搜索
查看: 5020|回复: 17

[AU3基础] 鼠标没有点在次窗口区域里,自动退出,求大侠赐教(已解决)

 火.. [复制链接]
发表于 2018-5-2 11:19:43 | 显示全部楼层 |阅读模式
本帖最后由 cqboyqx 于 2018-5-10 12:27 编辑

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
Global $Button1,$Form1,$Form2,$a

Opt("GUIOnEventMode", 1)
my_gui()
Func my_gui();  主窗口
$Form1 = GUICreate("Form1", 452, 282)
GUISetOnEvent($GUI_EVENT_CLOSE, "MYGUI_CLOSE")
$Button1 = GUICtrlCreateButton('弹出子窗', 184, 56, 62, 25);,$BS_MULTILINE
GUICtrlSetOnEvent($Button1, "TANCHU")
GUISetState(@SW_SHOW)
EndFunc
While 1
WEnd
Func TANCHU()
        MYGUI2()
EndFunc
Func MYGUI_CLOSE()
         Exit
EndFunc
Func MYGUI2();次窗口,启动后鼠标没有点击在次窗口区域内,而在主窗口区域里,就退出
GUISetState(@SW_DISABLE, $Form1)
$Form2 = GUICreate("Form1", 257, 157)
GUISetOnEvent($GUI_EVENT_CLOSE, "MYGUI2_CLOSE")
$a = _WinAPI_TrackMouseEvent ( $Form2,$WM_MOUSELEAVE)
GUISetState(@SW_SHOW)
EndFunc

Func MYGUI2_CLOSE()        
                Exit        
        EndFunc
发表于 2018-5-2 15:17:41 | 显示全部楼层

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
Global $Button1=0, $Form1, $Form2, $a

Opt("GUIOnEventMode", 1)
my_gui()
Func my_gui();  主窗口
        $Form1 = GUICreate("Form1", 452, 282)
        GUISetOnEvent($GUI_EVENT_CLOSE, "MYGUI_CLOSE")
        $Button1 = GUICtrlCreateButton('弹出子窗', 184, 56, 62, 25);,$BS_MULTILINE
        GUICtrlSetOnEvent($Button1, "TANCHU")
        GUISetState(@SW_SHOW)
EndFunc   ;==>my_gui

While 1
        Sleep(100)
WEnd

Func TANCHU()
        MYGUI2()
EndFunc   ;==>TANCHU

Func MYGUI_CLOSE()
        Exit
EndFunc   ;==>MYGUI_CLOSE

Func MYGUI2();次窗口,启动后鼠标没有点击在次窗口区域内,退出
        $Form2 = GUICreate("Form1", 300, 200,-1,-1,$Form1)
        GUISetState(@SW_SHOW)
        GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
        GUIRegisterMsg($WM_MOUSELEAVE, "WM_MOUSELEAVE")
EndFunc   ;==>MYGUI2

Func WM_MOUSEMOVE($hWnd, $Msg, $wParam, $lParam)
        $tagTRACKMOUSEEVENT = DllStructCreate("DWORD cbSize;DWORD dwFlags;HWND  hwndTrack;DWORD dwHoverTime")
        DllStructSetData($tagTRACKMOUSEEVENT, "cbSize", DllStructGetSize($tagTRACKMOUSEEVENT)) ;结构体缓冲区大小
        DllStructSetData($tagTRACKMOUSEEVENT, "dwFlags", BitOR($TME_HOVER,$TME_LEAVE)) ;注册WM_MOUSEHOVER和$WM_MOUSELEAVE消息
        DllStructSetData($tagTRACKMOUSEEVENT, "hwndTrack", $hWnd) ;当前窗口句柄
        DllStructSetData($tagTRACKMOUSEEVENT, "dwHoverTime", 300) ;触发的时间300ms
        $TRACKMOUSEEVENT = DllStructGetPtr($tagTRACKMOUSEEVENT)
        DllCall("user32.dll", "bool", "TrackMouseEvent","ptr",$TRACKMOUSEEVENT)
EndFunc   ;==>WM_MOUSEMOVE

Func WM_MOUSELEAVE($hWnd, $Msg, $wParam, $lParam)
        GUIDelete($Form2)
EndFunc   ;==>MYGUI2_CLOSE
 楼主| 发表于 2018-5-2 15:23:54 | 显示全部楼层
本帖最后由 cqboyqx 于 2018-5-2 15:26 编辑

回复 2# xzf680

谢谢大侠的回复,你这个是移开就关闭了,我想的是鼠标没有点击在次窗口上就退出次窗口,不是鼠标没有在次窗口就关闭
发表于 2018-5-2 16:13:16 | 显示全部楼层
回复 3# cqboyqx
退出次窗口,不是鼠标没有在次窗口就关闭

那麼退出次窗口的意思是??  次窗口還存在 隱藏起來  還是 次窗口不見了

不見了 不就是關閉 那 甚麼是關閉??
 楼主| 发表于 2018-5-2 16:42:29 | 显示全部楼层
回复 4# kk_lee69

可能我没有阐述清楚,就是如果鼠标点击主窗口,次窗口就关闭,类似与Combo下拉框模式,
发表于 2018-5-2 18:02:39 | 显示全部楼层
回复 5# cqboyqx


变通一下,如果不激活就隐藏。
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISys.au3>
Global $Button1=0, $Form1, $Form2, $a
 
Opt("GUIOnEventMode", 1)
my_gui()
Func my_gui();  主窗口
        $Form1 = GUICreate("Form1", 452, 282)
        GUISetOnEvent($GUI_EVENT_CLOSE, "MYGUI_CLOSE")
        $Button1 = GUICtrlCreateButton('弹出子窗', 184, 56, 62, 25);,$BS_MULTILINE
        GUICtrlSetOnEvent($Button1, "TANCHU")
        GUISetState(@SW_SHOW)
EndFunc   ;==>my_gui
 $Form2 = GUICreate("Form1", 300, 200,-1,-1,$Form1)
While 1
        Sleep(100)
                If Not WinActive ($Form2,'') Then  GUISetState(@SW_HIDE,$Form2)
WEnd
 
Func TANCHU()
        MYGUI2()
EndFunc   ;==>TANCHU
 
Func MYGUI_CLOSE()
        Exit
EndFunc   ;==>MYGUI_CLOSE
 
Func MYGUI2();次窗口,启动后鼠标没有点击在次窗口区域内,退出
;~         $Form2 = GUICreate("Form1", 300, 200,-1,-1,$Form1)
        GUISetState(@SW_SHOW,$Form2)
;~         GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
;~         GUIRegisterMsg($WM_MOUSELEAVE, "WM_MOUSELEAVE")
EndFunc   ;==>MYGUI2
 
发表于 2018-5-2 20:33:15 | 显示全部楼层
回复 5# cqboyqx
可能是你誤解了......

combo 按下下拉  就會建立 下拉清單  放開後 或者點擊別的地方  下拉清單就被刪除了

等待你下次 下拉  再重新建立 都是這樣運作的....

實在不懂你想要的東西
发表于 2018-5-2 21:14:15 | 显示全部楼层
回复 7# kk_lee69

就是你说的这个意思,用窗口来做一个仿combo效果
发表于 2018-5-2 21:26:04 | 显示全部楼层
回复 8# qsy666888

你是 cqboyqx ??

都有 COMBO 還用窗口模仿啥??

能畫圖表示嗎??
发表于 2018-5-2 22:04:14 | 显示全部楼层
回复 9# kk_lee69

哎呀,我估计他说的就是这个意思,可能COMBO里没有他想要的功能,他想自己仿一个COMBO模式来达到COMBO效果,6楼的应该满足他需要
发表于 2018-5-3 01:54:13 | 显示全部楼层
回复 5# cqboyqx


Global $is_tracking = False
Global $iteration = 1 ; Just to recognize different ConsoleWrite's in spammed console

Global $hGui = GUICreate('')

Global $sTrackMouseEvent = DllStructCreate('dword;dword;hwnd;dword')  ; Creating TRACKMOUSEEVENT Structure
Global $sTME_size = DllStructGetSize($sTrackMouseEvent)               ; getting size of structure - need for 1st argument

; Filling in: 
DllStructSetData($sTrackMouseEvent, 1, $sTME_size)      ; Size of a structure
DllStructSetData($sTrackMouseEvent, 2, 0x00000002)      ; TME_LEAVE
DllStructSetData($sTrackMouseEvent, 3, $hGui)           ; HWND of our GUI
DllStructSetData($sTrackMouseEvent, 4, 0xFFFFFFFF)  ; HOVER_DEFAULT - BUT IT'S NOT USED ANYWAY, SINCE WE'RE TRACKING ONLY MOUSE_LEAVE EVENT

Global $sTME_POINTER = DllStructGetPtr($sTrackMouseEvent) ; Getting the pointer to the structure, needed to TrackMouseEvent function



GUIRegisterMsg(0x0200, '__wm_mousemove')
GUIRegisterMsg(0x02A3, '__wm_mouseleave') ; WM_MOUSELEAVE code
GUISetState()

$Form2 = GUICreate("Form1", 300, 200,-1,-1,$hGui)

Func __wm_mouseleave($hwnd, $msg, $wParam, $lParam)
    $is_tracking = False
    ConsoleWrite('YOUR MOUSE HAS JUST LEAVED YOUR GUI WINDOW FOR THE ' & $iteration & ' TIME!' & @CRLF)
        GUISetState(@SW_SHOW,$Form2)
    $iteration += 1
EndFunc

Func __wm_mousemove($hwnd, $msg, $wParam, $lParam)
    If Not $is_tracking Then
        $is_tracking = True
        DllCall('user32.dll', 'bool', 'TrackMouseEvent', 'ptr', $sTME_POINTER) ; We're calling the tracking function
        ConsoleWrite('Starting tracking...' & @CRLF)
                GUISetState(@SW_HIDE,$Form2)
    EndIF
EndFunc

Do
Until GuiGetMsg() = -3
发表于 2018-5-3 12:36:59 | 显示全部楼层
回复 1# cqboyqx
打开主窗口后,点击弹出子窗按钮,
显示子窗口,鼠标离开子窗口区域,子窗口就退出。
是这个意思?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2018-5-3 14:39:03 | 显示全部楼层
回复 6# 骗子
谢谢大侠,正是此意思
 楼主| 发表于 2018-5-3 14:40:00 | 显示全部楼层
回复 10# qsy666888
昨天不在,正是你说的意思
发表于 2018-5-3 14:48:19 | 显示全部楼层
回复 12# chzj589

你這個跟 二樓是一樣的  樓主 又說不是
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 16:53 , Processed in 0.075468 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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