Привязка пунктов меню панели задач AutoHotkey к функциям?

Команда AutoHotkey Menu позволяет настраивать контекстное меню значка области уведомлений скрипта. , но, похоже, требуется, чтобы метки/подпрограммы были прикреплены к пунктам меню.

У меня есть некоторые функции, которые я мог бы преобразовать в подпрограммы, но предпочел бы этого не делать, поскольку их проще и понятнее использовать, а также есть локальные переменные, для преобразования которых потребуется рефакторинг. Кроме того, функции не выполняются автоматически и должны вызываться, а подпрограммы — это просто помеченные участки кода, поэтому они требуют дополнительной работы, чтобы избежать непреднамеренного вызова. Фактически, справочная страница AHK для Gosub специально предлагает вместо этого использовать функции:

Хотя Gosub полезен для простых подпрограмм общего назначения, рассмотрите возможность использования функций для более сложных целей.

Одним очевидным недостатком подпрограмм является то, что они не могут принимать аргументы.

Есть ли способ создать пункты меню, привязанные к функциям?


person Synetech    schedule 30.09.2012    source источник
comment
@ударь-и-беги-избиратель, в чем твоя проблема? Нет, правда; без поясняющего комментария я не могу решить какие-либо проблемы, которые могут возникнуть у вас (если таковые имеются вздох) с вопросом.   -  person Synetech    schedule 15.12.2012


Ответы (2)


Каждая подпрограмма может вызывать соответствующую функцию.

person echristopherson    schedule 30.09.2012
comment
Если я все равно создаю подпрограммы, то зачем мне возиться с функциями? Мне все еще нужно провести рефакторинг, чтобы предотвратить выполнение подпрограмм (я узнал об этом на собственном горьком опыте, так как раньше мои функции были вверху, и мне было интересно, почему скрипт зависал, когда я менял им подпрограммы). - person Synetech; 30.09.2012
comment
Как будут выполняться подпрограммы? - person echristopherson; 01.10.2012
comment
Потому что подпрограммы — это не более чем метка. Если блок кода окажется в середине выполнения (как это было, когда я преобразовал функции в верхней части моего скрипта в подпрограммы, заменив () после имен функций на :), то строки под метками будут казнен. - person Synetech; 01.10.2012
comment
Ну да; но только отдельные линии. AHK не будет выполнять подпрограммы, пока они не будут GoSub запущены или вызваны с помощью горячей клавиши. - person echristopherson; 01.10.2012
comment
Он не будет разветвляться на подпрограммы в других частях скрипта, но если они мешают, он пронесется сквозь них. - person Synetech; 01.10.2012
comment
Я понимаю. Я не знал, что о подпрограммах, определенных в разделе автоматического выполнения. Похоже, все, что вам нужно сделать, чтобы предотвратить это, это поставить Return перед началом определения подпрограммы. - person echristopherson; 06.10.2012
comment
Я знаю. - person Synetech; 06.10.2012

Подпрограммы не выполняются автоматически, если вы правильно используете операторы return.

Как правило, в конце каждой подпрограммы или многострочной горячей клавиши ставится return (для однострочных горячих клавиш это не требуется). (Выполнение функции завершается в закрывающей фигурной скобке, поэтому вам не нужен возврат, если, конечно, вы не хотите возвращать значение или завершать завершение в какой-либо другой точке функции.)

Кроме того, убедитесь, что вы определили любую подпрограмму за пределами раздела auto-execute сценария, чтобы предотвратить ее автоматическое выполнение при запуске сценария.

Подробнее о разделе «автоматическое выполнение» из документов AHK:

Верхняя часть скрипта (раздел автоматического выполнения) После загрузки скрипта он начинает выполняться с верхней строки, продолжаясь до тех пор, пока не встретится метка Return, Exit, горячая клавиша/строка автозапуска или физический конец скрипта (в зависимости от того, что идет первым). Эта верхняя часть сценария называется разделом автоматического выполнения.

Сценарий, который не является постоянным и в котором отсутствуют горячие клавиши, строки быстрого доступа, OnMessage и графический интерфейс, завершится после завершения раздела автоматического выполнения. В противном случае он будет работать в режиме ожидания, реагируя на такие события, как горячие клавиши, горячие строки, события графического интерфейса, настраиваемые элементы меню и таймеры.

EDIT: К сожалению, вы по-прежнему не можете привязывать вызовы функций направления к меню, потому что это не поддерживается. Но вы можете вызывать свои функции из соответствующих подпрограмм (теперь, когда вы знаете, как предотвратить их автоматический запуск). Выставляя некоторое состояние глобально, вы можете устранить необходимость передачи аргументов вашим функциям. Однако, если вы не хотите этого делать, вы можете просто создать переменные, инициализированные любыми значениями, которые вы хотите передать в «привязанную» функцию в этой точке, а затем использовать их для создания эквивалента «привязанной» функции. вызов, который вы хотели сделать. Например:

subroutine:
arg1 = <some expression>
arg2 = <some expression>
MyFunction(arg1, arg1)
return

MyFunction(a, b) 
....
}
person Himanshu P    schedule 05.10.2012
comment
› Подпрограммы не выполняются автоматически, если вы правильно используете операторы return. Да, я знаю, и я так и сделал (но все равно переместил подпрограммы в конец). Однако это не отвечает на этот вопрос. - person Synetech; 06.10.2012
comment
Зачем передавать аргументы, если они глобальные (и зачем делать их глобальными, если вы можете их передать)? - person echristopherson; 06.10.2012
comment
@echristopherson, они не глобальные, это строки (по крайней мере, в моем случае). - person Synetech; 06.10.2012
comment
@echristopherson Несколько причин, по которым можно было бы это сделать 1) Таким образом, значения, от которых на самом деле зависит функция, не являются глобальными и не могут быть случайно изменены внешним кодом. 2) Теперь вы можете сделать что-то вроде рекурсивного вызова функции (что обычно требует, чтобы функция передала ей локальные аргументы) [Я немного отредактировал свой пост, чтобы сделать его более понятным, в частности, изменив имена переменных g_arg1, g_arg2 просто arg1, arg2, потому что первое, казалось, подразумевало, что какое-то внутреннее состояние было глобально раскрыто, что было не так] - person Himanshu P; 07.10.2012