Что нового

Меню в трее по правой кнопке мыши

kyi

Новичок
Сообщения
43
Репутация
0
Добрый день!
Хочу что бы при клике левой кнопкой мыши на иконке в трее программа разворачивалась, а при нажатии правой кнопкой мыши появлялось доп меню
Сейчас делаю так
Код:
#NoTrayIcon ;не показывать иконку в трее

#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>

Opt("TrayMenuMode", 1 + 2) ; Не отображать в трее пункты меню по умолчанию (Script Paused/Exit) и не отмечать галочками при выборе.

Local $test = GUICreate("test",350,214,-1,-1,-1,-1)
GUISetState(@SW_SHOW,$test)

; Создаем меню в трее
	$TrayTest1 = TrayCreateItem('Test1') ; Создает меню при клике на иконке в трее
	$TrayTest2 = TrayCreateItem('Test2')
	TrayCreateItem('') ; Создает разделитель
	$TrayExit = TrayCreateItem('Выход')


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

; Проверка нажат ли крестик на окне если нажат, то выходим
		Case $GUI_EVENT_CLOSE
			Exit

; Проверка нажата ли кнопка Свернуть, если нажата, сворачиваем в трей
		Case $GUI_EVENT_MINIMIZE
			Opt("TrayIconHide", 0) 	; Включает отображение иконки в трее
			GUISetState(@SW_HIDE)	; Сворачивает окно в трей
	EndSwitch
	
; Восстанавливает из трея
	Switch TrayGetMsg()
        Case $TRAY_EVENT_PRIMARYUP
            Opt("TrayIconHide", 1)
            GUISetState(@SW_SHOW)

    EndSwitch
WEnd
При таком раскладе меню создается всегда, хоть нажимаю левой кнопкой, хоть правой.
Начинаю думать как от этого избавиться и при чтении справки нахожу событие $TRAY_EVENT_SECONDARYDOWN
Мысль работает так. Если нажимать правую кнопку, то надо вызывать функцию которая будет создавать меню по этому событию - делаю
Код:
#NoTrayIcon ;не показывать иконку в трее

#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>

Opt("TrayMenuMode", 1 + 2) ; Не отображать в трее пункты меню по умолчанию (Script Paused/Exit) и не отмечать галочками при выборе.

Local $test = GUICreate("test",350,214,-1,-1,-1,-1)
GUISetState(@SW_SHOW,$test)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

; Проверка нажат ли крестик на окне если нажат, то выходим
		Case $GUI_EVENT_CLOSE
			Exit

; Проверка нажата ли кнопка Свернуть, если нажата, сворачиваем в трей
		Case $GUI_EVENT_MINIMIZE
			Opt("TrayIconHide", 0) 	; Включает отображение иконки в трее
			GUISetState(@SW_HIDE)	; Сворачивает окно в трей
	EndSwitch
	
; Восстанавливает из трея
	Switch TrayGetMsg()
        Case $TRAY_EVENT_PRIMARYUP
            Opt("TrayIconHide", 1)
            GUISetState(@SW_SHOW)
        
        Case $TRAY_EVENT_SECONDARYDOWN
            MenuTray()

    EndSwitch
WEnd


; Функция создания меню в трее
Func MenuTray()
	$TrayTest1 = TrayCreateItem('Test1') ; Создает меню при клике на иконке в трее
	$TrayTest2 = TrayCreateItem('Test2')
	TrayCreateItem('') ; Создает разделитель
	$TrayExit = TrayCreateItem('Выход')
EndFunc
но получаю повторяющиеся меню и нестабильную работу программы.
Товарищи, подскажите идею как можно выполнить мою задумку?
Только очень прошу, рассказывайте как можно проще и подробнее.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
В описании функций есть все подробности
Код:
#NoTrayIcon ;не показывать иконку в трее

#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>

Opt("TrayMenuMode", 1 + 2) ; Не отображать в трее пункты меню по умолчанию (Script Paused/Exit) и не отмечать галочками при выборе.
Global $nTrayTest1 = TrayCreateItem("Test1")
Global $nTrayTest2 = TrayCreateItem("Test2")
TrayCreateItem("")
Global $nTrayExit = TrayCreateItem("Выход")
TraySetClick(16) ; Устанавливает способ вызова меню трея: 16 = Отпусканием вторичной кнопки мыши

Local $test = GUICreate("test", 350, 214, -1, -1, -1, -1)
GUISetState(@SW_SHOW, $test)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

		; Проверка нажат ли крестик на окне если нажат, то выходим
		Case $GUI_EVENT_CLOSE
			Exit

			; Проверка нажата ли кнопка Свернуть, если нажата, сворачиваем в трей
		Case $GUI_EVENT_MINIMIZE
			TraySetState($TRAY_ICONSTATE_SHOW) ; Включает отображение иконки в трее
			GUISetState(@SW_HIDE) ; Сворачивает окно в трей
	EndSwitch

	; Восстанавливает из трея
	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYUP
			TraySetState($TRAY_ICONSTATE_HIDE)
			GUISetState(@SW_SHOW)
		Case $nTrayExit
			Exit
		Case $nTrayTest1
			MsgBox(0, "", "Test1")
		Case $nTrayTest2
			MsgBox(0, "", "Test2")
	EndSwitch
WEnd
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
kyi, клик по названию функции поможет вам найти описание


Добавлено:
Сообщение автоматически объединено:

Или скопировать описание каждой функции в код?
 
Автор
K

kyi

Новичок
Сообщения
43
Репутация
0
Tempo сказал(а):
kyi, клик по названию функции поможет вам найти описание


Добавлено:
Сообщение автоматически объединено:

Или скопировать описание каждой функции в код?



Видимо я чего то не понимаю. Где функция? Я не вижу что бы у вас где то было
Func ()
...
EndFunc
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
kyi, в коде используются только нативные функции. Почему там должно быть Func...EndFunc?


Добавлено:
Сообщение автоматически объединено:

Ваши вопросы легко решаются чтением справки вот что я пытаюсь сказать


Добавлено:
Сообщение автоматически объединено:

Если бы вы её читали то увидели что для определения события которое должно вызывать меню используется функция TraySetClick и отдельная обработка событий тут не при чём
 
Верх