Что нового

Появление-исчезновение окна, если указатель мыши навести-убрать из значка в трее

beve

Осваивающий
Сообщения
104
Репутация
30
У меня не получается, чтобы при наведени на значок программы в трее окно стало видимым, а когда убрать указатель мышки из этого значка - окно исчезло...

Вернее получилось, но не тем способом, которым ожидал и не до конца так, как хотел. Вот мой пример:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <GUICtrlSetOnHover_UDF.au3>
#include <ModernMenuRaw.au3>
Opt("GUIOnEventMode",1)
Global $bi=0
#REGION ~GUI
Global $hGUI = GUICreate("TestGui", 300,  100,-1,-1,-1,0x00000080)
GUISetOnEvent($GUI_EVENT_CLOSE, "MenuEvents")
#EndRegion ### END GUI section ###
;----------------------------------------------------------------------------------
#Region ~Tray
Global $nTrayIcon
$nTrayIcon=_TrayIconCreate("TrayIcon", "","", "TrayCallBack") 
_TrayIconSetClick(-1, 16)
GUICtrlSetOnHover($nTrayIcon, "Hover_Func_ForTrayIcon", "Leave_Hover_Func_ForTrayIcon")

_TrayCreateContextMenu() 
; пункт о программе
Global $TrayAbout    = _TrayCreateItem("О программе")
GUICtrlSetOnEvent(-1, "MenuEvents")
_TrayItemSetIcon(-1, "shell32.dll", -24) 
;разделитель
_TrayCreateItem("")
_TrayItemSetIcon(-1, "") 
;пункт выход
Global $TrayExit    = _TrayCreateItem("Выход")
GUICtrlSetOnEvent(-1, "MenuEvents")
_TrayItemSetIcon(-1, "shell32.dll", -28) 
;-----------------------------------------------------------------------------------
#EndRegion ~Tray
_TrayIconSetState($nTrayIcon, @SW_SHOW) ; Show the tray icon 

While 1
Sleep(100)
WEnd

#region ~Functions
Func Hover_Func_ForTrayIcon($CtrlID)
	GUISetState(@SW_HIDE, $hGUI)
	;GUISetState(@SW_SHOW, $hGUI)
EndFunc
Func Leave_Hover_Func_ForTrayIcon($CtrlID)
	;GUISetState(@SW_HIDE, $hGUI)
EndFunc

;выход и программы
Func CLOSEClicked()
	if @GUI_WINHANDLE = $hGui or @GUI_CTRLID = $TrayExit then
		_TrayIconDelete($nTrayIcon)
		Exit
	endif
EndFunc
;
Func MenuEvents()
	Local $Msg = @GUI_CtrlID
	Switch $Msg
		Case $GUI_EVENT_CLOSE, $TrayExit
			CLOSEClicked()
;
		Case $TrayAbout
			MsgBox(64,"About","",-1,$hGUI)
	EndSwitch
EndFunc
;
Func TrayCallBack($nID, $nMsg)
	Switch $nID
Case $nTrayIcon
	GUISetState(@SW_SHOW, $hGui)
	EndSwitch
EndFunc
#Endregion ~Functions


Мне важно чтобы работало именно в таком формате, когда значок и меню в трее создается с помощью ModernMenuRaw.au3. В данном случае функция GUICtrlSetOnHover() не работает корректно, потому что $nTrayIcon= 1 и в результате не то. Но, как бы найти правильное решение, чтобы окно пропадало, если убирать указатель мышки с одного этого значка программы?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
beve
Узнать положение иконки в трее еще можно так:
Код:
#include <SysTray_UDF.au3>

_MouseIconTray()
Sleep(5000)
Func _MouseIconTray()
	Local $iIndex = _SysTrayIconIndex(@AutoItPID)
	If @error Then Return
	Local $aTrayIcon_Pos = _SysTrayIconPos($iIndex)
	If @error Then Return
	MouseMove($aTrayIcon_Pos[0], $aTrayIcon_Pos[1])
EndFunc   ;==>_MouseIconTray
SysTray_UDF

У меня так работает:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <GUICtrlSetOnHover_UDF.au3>
#include <ModernMenuRaw.au3>
#include <SysTray_UDF.au3>

Opt("GUIOnEventMode", 1)
Global $bi = 0, $aTrayIcon_Pos, $aMousePos
#region ~GUI
Global $hGUI = GUICreate("TestGui", 300, 100, -1, -1, -1, 0x00000080)
GUISetOnEvent($GUI_EVENT_CLOSE, "MenuEvents")
#endregion ~GUI

;----------------------------------------------------------------------------------
#region ~Tray
Global $nTrayIcon
$nTrayIcon = _TrayIconCreate("TrayIcon", "", "", "TrayCallBack")
_TrayIconSetClick(-1, 16)
GUICtrlSetOnHover($nTrayIcon, "Hover_Func_ForTrayIcon", "Leave_Hover_Func_ForTrayIcon")

_TrayCreateContextMenu()
; пункт о программе
Global $TrayAbout = _TrayCreateItem("О программе")
GUICtrlSetOnEvent(-1, "MenuEvents")
_TrayItemSetIcon(-1, "shell32.dll", -24)
;разделитель
_TrayCreateItem("")
_TrayItemSetIcon(-1, "")
;пункт выход
Global $TrayExit = _TrayCreateItem("Выход")
GUICtrlSetOnEvent(-1, "MenuEvents")
_TrayItemSetIcon(-1, "shell32.dll", -28)
;-----------------------------------------------------------------------------------
#endregion ~Tray
_TrayIconSetState($nTrayIcon, @SW_SHOW) ; Show the tray icon
_MouseIconTray()
While 1
	Sleep(10)
	$aMousePos = MouseGetPos()
	If $aMousePos[0] > $aTrayIcon_Pos[0] And $aMousePos[0] < $aTrayIcon_Pos[0] + 20 And _
		$aMousePos[1] > $aTrayIcon_Pos[1] - 30 Then
		GUISetState(@SW_SHOW, $hGUI)
	Else
		GUISetState(@SW_HIDE, $hGUI)
	EndIf
WEnd

#region ~Functions
;выход и программы
Func CLOSEClicked()
	If @GUI_WinHandle = $hGUI Or @GUI_CtrlId = $TrayExit Then
		_TrayIconDelete($nTrayIcon)
		Exit
	EndIf
EndFunc   ;==>CLOSEClicked
;
Func MenuEvents()
	Local $Msg = @GUI_CtrlId
	Switch $Msg
		Case $GUI_EVENT_CLOSE, $TrayExit
			CLOSEClicked()
			;
		Case $TrayAbout
			MsgBox(64, "About", "", -1, $hGUI)
	EndSwitch
EndFunc   ;==>MenuEvents
;
Func _MouseIconTray()
	Local $iIndex = _SysTrayIconIndex(@AutoItPID)
	If @error Then Return
	$aTrayIcon_Pos = _SysTrayIconPos($iIndex)
	If @error Then Return
	Return $aTrayIcon_Pos
EndFunc   ;==>_MouseIconTray
 
Автор
beve

beve

Осваивающий
Сообщения
104
Репутация
30
Метод немного не надежный ибо придется постоянно запускать еще в цикле и функцию _MouseIconTray() на проверку новых координат. И будут другие неудобства. Есть какой способ еще понадежней?
 
Верх