Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Menu", в содержании - "Window Management" - "Controls" - "Menu", v1.0.46.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

Menu

Создаёт, удаляет, модифицирует и показывает меню. Изменяет значок скрипта в области уведомлений (трее) и всплывающую подсказку этого значка. Для компилированных скриптов определяет, может ли быть открыто главное окно скрипта.

Menu, MenuName, Cmd [, P3, P4, P5]

Параметры

MenuName Имя меню. Значение этого параметра для меню в области уведомлений - Tray. Пользовательские меню создаются командой Add. Например: Menu, MyMenu, Add, Item1. Будучи созданным, пользовательское меню может быть показано командой Show. Оно также может быть присоединено в качестве подменю к любому другому меню (или к нескольким) командой Add.
Cmd, P3, P4, P5 Эти 4 параметра зависят друг от друга. В списке ниже показаны их возможные комбинации.

Добавление или изменение пунктов меню

Add [, MenuItemName, Label-or-Submenu, Pn] Это многоцелевая команда, которая может добавить пункт меню, обновить сопоставленные ему метку или подменю или преобразовать нормальный пункт меню в подменю (и наоборот). Если пункт, чьё имя задано в параметре MenuItemName, ещё не существует, он будет добавлен. Иначе будут обновлены его метка или подменю.

Чтобы добавить не пункт, а линию-разделитель, опустите все 3 параметра в квадратных скобках.

Подпрограмма, на которую указывает метка, запускается как новый поток, когда пользователь выбирает соответствующий пункт в меню (так же, как это происходит по команде Gosub или нажатию горячей клавиши). Если параметр Label-or-Submenu опущен, значение MenuItemName будет использовано одновременно как имя пункта меню и как имя метки.

Чтобы превратить MenuItemName в подменю, т.е. в пункт, который, будучи выбранным, открывает новое меню, задайте параметр Label-or-Submenu как двоеточие со следующим сразу за ним именем уже существующего пользовательского меню. Например:

Menu, MySubmenu, add, Item1
Menu, tray, add, This Menu Item Is A Submenu, :MySubmenu

Параметр Pn позволяет задать приоритет запускаемого данным пунктом потока. Например, P1. Если при добавлении пункта этот параметр опущен, приоритет будет 0, что является стандартным значением по умолчанию. Если этот параметр опущен при изменении пункта, существующий приоритет не будет изменён. Если у пункта нужно изменить только приоритет, опустите параметр Label-or-Submenu. При задании значения приоритета используйте десятичные числа.

Delete [, MenuItemName] Удаляет пункт из меню. Стандартные пункты, такие как Exit (см. ниже), не могут удаляться по отдельности. Если удаляется пункт по умолчанию, эффект будет тот же, что и при использовании опции NoDefault. Если параметр MenuItemName опущен, всё меню, указанное в MenuName, будет удалено, так же как и все пункты в других меню, которые используют это меню как подменю.

DeleteAll Удаляет из меню все пункты, добавленные пользователем, оставляя меню пустым, если только оно не содержит стандартных пунктов (см. ниже). В отличие от меню, полностью удаляемого командой Delete, пустое меню продолжает существовать, так что все другие меню, использующие его как своё подменю, сохранят соответствующий пункт.

Rename, MenuItemName [, NewName] Переименовывает пункт меню. Новое имя задаётся в параметре NewName. Если этот параметр пустой, пункт будет преобразован в линию-разделитель. Новое имя не должно совпадать с каким-то из уже существующих имён пользовательских пунктов. Связанные с пунктом метка или подменю не изменяются.

Check, MenuItemName Ставит отметку рядом с именем пункта (если она уже не стоит).

Uncheck, MenuItemName Убирает отметку, если она есть.

ToggleCheck, MenuItemName Ставит отметку, если её нет. Убирает, если есть.

Enable, MenuItemName Разблокирует пункт меню, если он был ранее блокирован.

Disable, MenuItemName Блокирует пункт меню (делает его серым).

ToggleEnable, MenuItemName Разблокирует пункт, если он блокирован. Блокирует, если он действующий.

Default [, MenuItemName] Задаёт пункт по умолчанию и выделяет его имя в меню жирным шрифтом (применение этой команды ко всем меню, кроме того, что в области уведомлений, в настоящее время даёт лишь косметический эффект). Когда пользователь делает двойной щелчок по значку скрипта в трее, задействуется пункт меню по умолчанию. Если параметр MenuItemName опущен, команда действует так же, как команда NoDefault ниже.

NoDefault Для меню в области уведомлений означает возвращение к стандартному пункту по умолчанию. Если скрипт не компилированный, то это пункт Open, если компилированный, то пункта по умолчанию нет (за исключением случая, когда была выбрана опция MainWindow). Если пункт Open в меню отсутствует из-за того, что ранее была использована команда NoStandard (см. ниже), умолчательный пункт будет отсутствовать, так что двойной щелчок по значку в трее не будет производить никакого эффекта. Для меню не в области уведомлений жирный шрифт в имени пункта по умолчанию будет заменён на обычный.

Standard Добавляет стандартные пункты в нижнюю часть меню (если их ещё нет). Эта команда применима к любому меню.

NoStandard Удаляет стандартные (не пользовательские) пункты из меню в области уведомлений (если таковые присутствуют).

Изменение значка в области уведомлений или его подсказки (MenuName должно быть Tray)

Icon [, FileName, IconNumber, 1] Заменяет значок скрипта на один из тех, что имеются в файле, указанном в параметре FileName. Поддерживаются файлы с расширениями ICO, CUR, ANI, EXE, DLL, CPL, SCR и другие, в которых содержатся значки. Чтобы использовать группу значков иную, чем первая, укажите её номер в параметре IconNumber (если опущен, считается равным 1). Например, значение 2 загрузит значок по умолчанию из второй группы. Укажите звёздочку (*) как значение FileName, чтобы вернуть скрипт к его значку по умолчанию.

Последний параметр может принимать значения 1 или 0, которые означают "замораживание" и "размораживание" значка. Замороженный значок не будет изменять свой вид при выполнении команд Pause и Suspend. Чтобы заморозить текущий значок, используйте команду Menu, Tray, Icon,,, 1 (или 0, чтобы разморозить).

Изменение значка в трее влияет также на значок, используемый InputBox, Progress и создаваемыми впоследствии окнами GUI. Это также затрагивает компилированные скрипты, даже если при компиляции им был присвоен собственный значок. Примечание: изменение значка не показывает значок, если он был до этого спрятан, например, директивой #NoTrayIcon; чтобы сделать это, используйте команду Menu, Tray, Icon (без параметров).

При отображении значков из файлов иного формата, чем ICO, возможны небольшие искажения, особенно для значков 16x16. Чтобы избежать этого, храните значки в ICO-файлах.

Значки можно найти в системных файлах с расширениями DLL и CPL. Например:

Menu, Tray, Icon, Shell32.dll, 174 ; Путь к файлу опущен, чтобы команда работала также на Windows 9x.

Встроенные переменные A_IconNumber и A_IconFile содержат номер и полный путь используемого значка (обе они пусты, если используется значок по умолчанию).

Icon (без параметров) Создаёт значок в трее, если он отсутствует. Отменяет действие директивы #NoTrayIcon, если она присутствует в скрипте.

NoIcon Удаляет значок в трее, если он есть. Если команда применяется в самом верху скрипта, при запуске скрипта значок всё же появляется на короткое время. Чтобы избежать этого, используйте вместо этой команды директиву #NoTrayIcon. Встроенная переменная A_IconHidden содержит 1, если значок спрятан, иначе - 0.

Tip [, Text] Изменяет подсказку значка в трее, которая появляется при наведении на него курсора мыши. Чтобы подсказка состояла из нескольких строк, используйте перевод строки (`n), например, Строка1`nСтрока2. Максимальная длина воспроизводимого текста - 127 символов. Если параметр Text опущен, это приведёт к показу текста по умолчанию. Встроенная переменная A_IconTip содержит текущий текст подсказки (пуста, если текст - по умолчанию).

Разное

Show [, X, Y] Показывает меню, позволяя пользователю выбрать пункт с помощью клавиш-стрелок, акселераторов (подчёркнутые буквы) или мышью. Показано может быть любое меню, за исключением строки меню GUI. Если обе координаты (X и Y) опущены, меню показывается в месте, где курсор мыши. Если опущена одна из них, её значение берётся из координат курсора мыши. Координаты считаются относительно активного окна. Используйте предварительно команду CoordMode, Menu, чтобы перейти к экранным координатам.

Color, ColorValue [, Single] Заменяет цвет фона меню на заданный в параметре ColorValue. Возможные значения включают 16 имён цветов, используемые в HTML, а также 6-значные числа в формате RGB (красный-зелёный-синий, см. примеры в статье SplashImage). Чтобы вернуть меню его цвет по умолчанию, оставьте этот параметр пустым (или задайте его словом Default). Если слово Single не присутствует в качестве последнего параметра, все подменю также изменят цвет фона. Эта команда не работает в Windows 95/NT.

Click, ClickCount Если ClickCount задать как 1, это позволит пункту по умолчанию срабатывать от одиночного щелчка по значку в трее. Чтобы вернуться к двойному щелчку, задайте 2. Например:

Menu, Tray, Click, 1

MainWindow Эта команда действует только на компилированные скрипты, позволяя главному окну скрипта открываться через значок в трее, что иначе невозможно. Она также включает пункты в меню View главного окна, такие как "Lines most recently executed" (последние выполненные строки), позволяя пользователю просматривать исходный код скрипта и другую информацию. MenuName должно иметь значение TRAY.

NoMainWindow (по умолчанию) Действует на компилированные скрипты. Запрещает открытие главного окна. Но даже если выбрана эта опция, следующие команды всё-таки способны показывать главное окно во время выполнения скрипта: ListLines, ListVars, ListHotkeys и KeyHistory. MenuName должно иметь значение TRAY.

UseErrorLevel [, off] Если эта опция в скрипте не используется, она имеет значение по умолчанию OFF. В этом случае при ошибке в ходе выполнения команды меню будет показано диалоговое окно и выполнение текущего потока будет прекращено. Если же использовать такую команду: Menu, Tray, UseErrorLevel, то в случае ошибки диалоговое окно показано не будет и поток не будет остановлен; вместо этого значение переменной ErrorLevel будет равно 1. Чтобы вернуться к настройке по умолчанию, используйте команду с параметром OFF. Эта установка имеет глобальное действие и затрагивает все меню, а не только указанное в параметре MenuName.

Примечания

Чтобы подчеркнуть одну из букв в имени пункта, поставьте перед ней амперсанд (&). Когда меню показано, такой пункт может быть выбран нажатием соответствующей буквы на клавиатуре. Чтобы показать амперсанд как обычный текстовый символ, используйте его дважды. Например: Save && Exit.

Имена меню и пунктов могут содержать до 260 символов.

При ссылках на существующие меню или пункты, регистр можно не учитывать, но амперсанды должны быть указаны. Например, &Open.

Линии-разделители могут добавляться в меню командой Menu, tray, add (все следующие параметры опускаются). Но они не могут удаляться по отдельности. Обходной путь - удалить все пункты командой Menu, tray, DeleteAll и затем заново добавить все нужные пункты.

Новые пункты всегда добавляются снизу. Для меню в трее: чтобы поместить ваши (уже добавленные) пункты выше стандартных, используйте команду Menu, tray, NoStandard, а затем Menu, tray, Standard.

На стандартные пункты меню, такие как "Pause Script" и "Suspend Hotkeys", нельзя воздействовать индивидуально через какие-либо подкоманды команды Menu.

Когда меню пустое, как, например, после использования команды Menu, MyMenu, DeleteAll, оно не может быть показано. Если пустым становится меню в трее, щелчки мыши по значку не производят никакого эффекта (в таких случаях обычно лучше использовать директиву #NoTrayIcon).

Если связанная с пунктом подпрограмма уже выполняется, а пользователь опять выбирает этот пункт, подпрограмма будет снова запущена, как новый поток, прерывающий (приостанавливающий) выполнение предыдущего. Чтобы вместо этого повторный выбор пункта буферизовался (был отсрочен), используйте команду Critical в качестве первой строки подпрограммы (однако это приведёт к тому, что буферизоваться будут и другие события, такие как нажатие горячей клавиши).

Запускаемая через меню подпрограмма стартует со значениями по умолчанию для настроек, таких, как SendMode. Эти умолчания могут быть изменены в секции автовыполнения (верхняя часть скрипта).

Встроенные переменные A_ThisMenuItem и A_ThisMenuItemPos содержат имя и позицию последнего использованного пункта пользовательского меню. A_ThisMenu содержит имя этого меню. Эти переменные полезны для меню, чьи пункты могут меняться. В этом случае обычно лучше всего привязать все такие пункты к одной и той же подпрограмме, которая определяла бы по вышеупомянутым переменным, какой пункт её вызвал, и совершала соответствующие действия.

Чтобы скрипт, содержащий только меню, оставался постоянно в памяти, используйте директиву #Persistent.

Примеры

; ПРИМЕР №1: Этот скрипт добавляет новый пункт внизу меню в трее.

#Persistent  ; Выполнять скрипт, пока не закроет пользователь.
Menu, tray, add  ; Добавить разделитель.
Menu, tray, add, Пункт1, MenuHandler  ; Добавить новый пункт.
return

MenuHandler:
MsgBox Вы выбрали %A_ThisMenuItem% из меню %A_ThisMenu%.
return 

; ПРИМЕР №2: Этот скрипт создаёт всплывающее меню, вызываемое комбинацией Win-Z.

; Создать всплывающее меню добавлением пунктов в него.
Menu, MyMenu, Add, Item1, MenuHandler
Menu, MyMenu, Add, Item2, MenuHandler
Menu, MyMenu, Add  ; Добавить разделитель.

; Создать другое меню для использования его как подменю.
Menu, Submenu1, Add, Item1, MenuHandler
Menu, Submenu1, Add, Item2, MenuHandler

; Добавить подменю в первое меню.
Menu, MyMenu, Add, My Submenu, :Submenu1

Menu, MyMenu, Add  ; Добавить разделитель ниже подменю.
Menu, MyMenu, Add, Item3, MenuHandler  ; Добавить новый пункт ниже подменю.
return  ; Конец секции автовыполнения.

MenuHandler:
MsgBox Вы выбрали %A_ThisMenuItem% из меню %A_ThisMenu%.
return

#z::Menu, MyMenu, Show  ; Показывать меню по нажатию Win-Z. 

; ПРИМЕР №3: Этот скрипт демонстрирует разнообразные команды меню.

#Persistent
#SingleInstance
menu, tray, add ; separator
menu, tray, add, TestToggle&Check
menu, tray, add, TestToggleEnable
menu, tray, add, TestDefault
menu, tray, add, TestStandard
menu, tray, add, TestDelete
menu, tray, add, TestDeleteAll
menu, tray, add, TestRename
menu, tray, add, Test
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TestToggle&Check:
menu, tray, ToggleCheck, TestToggle&Check
menu, tray, Enable, TestToggleEnable ; Разблокирует пункт TestToggleEnable.
menu, tray, add, TestDelete ; Similar to above.
return

TestToggleEnable:
menu, tray, ToggleEnable, TestToggleEnable
return

TestDefault:
if default = TestDefault
{
    menu, tray, NoDefault
    default =
}
else
{
    menu, tray, Default, TestDefault
    default = TestDefault
}
return

TestStandard:
if standard <> n
{
    menu, tray, NoStandard
    standard = n
}
else
{
    menu, tray, Standard
    standard = y
}
return

TestDelete:
menu, tray, delete, TestDelete
return

TestDeleteAll:
menu, tray, DeleteAll
return

TestRename:
if NewName <> renamed
{
    OldName = TestRename
    NewName = renamed
}
else
{
    OldName = renamed
    NewName = TestRename
}
menu, tray, rename, %OldName%, %NewName%
return

Test:
MsgBox, Вы выбрали "%A_ThisMenuItem%" из меню "%A_ThisMenu%".
return

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.