1

Тема: AHK: Несколько строк кода, как параметр функции.

Здравствуйте! Создал скрипт, который работает на ура, но в нём есть небольшой недостаток. В нём много повторяющихся/похожих строк. Хочется скомпоновать всё это в функцию.
Вот пример имеющегося у меня кода:


~1::
IfWinExist, Curves
{
    IfWinActive, Curves
    {
        ControlFocus, PSViewC1, Curves
        ControlSend, PSViewC1, {LAlt Down}, Curves
        ControlSend, PSViewC1, {3}, Curves
        ControlSend, PSViewC1, {LAlt Up}, Curves
    }
}
Return

~LCtrl & SPACE::
IfWinExist, Total Commander
{
    IfWinActive, Total Commander
    {
		Send, {SPACE}
		WinWaitActive, Комментарий,
		Send, ^{A}
		Send, {BACKSPACE}
		SendInput {Raw}ОТПЧ
		Send, {F2}
    }
}
Return

Как видите в обоих примерах используется одинаковая, если можно так сказать, конструкция.

  • Проверяем есть ли такое окно.
    Проверяем активно ли оно.
    Выполняем некоторые действия.

Кроме того, имеются вложенные проверки:


~NumpadENTER::
IfWinExist, Curves
{
    IfWinActive, Curves
    {
		Send, {Enter}
		WinWaitActive, Adobe Photoshop, Save changes, 1
		IfWinExist, Adobe Photoshop, Save changes
		{
			IfWinActive, Adobe Photoshop, Save changes
			{
				Send, {Enter}
				WinWaitActive, JPEG Options, , 1
				IfWinExist, JPEG Options
				{
					IfWinActive, JPEG Options
					{
						Send, {Enter}
					}
				}
			}
		}		
    }
}

Теперь, имеющийся код хочу укоротить, за счёт создания функции проверки окна, с названием и текстом отправляемым как параметр и выполнения ряда команд, тоже отправляемых как параметр. Знаю что, это не правильно, но что-бы было нагляднее, что мне нужно:


interacts(mywintitle, myactions)
{
   IfWinExist, mywintitle
   {
       IfWinActive, mywintitle
       {
          myactions
       }
   }
}

~1::
myCurActions = ;НЕ ЗНАЮ КАК ЗДЕСЬ СОХРАНИТЬ НЕСКОЛЬКО СТРОК В ОДНУ ПЕРЕМЕННУЮ. ВОЗМОЖНО ЛИ ЭТО?
        ControlFocus, PSViewC1, Curves
        ControlSend, PSViewC1, {LAlt Down}, Curves
        ControlSend, PSViewC1, {3}, Curves
        ControlSend, PSViewC1, {LAlt Up}, Curves
interacts(Curves, myCurActions)
Return

Каким будет правильный синтаксис подобного кода?
Спасибо!

2

Re: AHK: Несколько строк кода, как параметр функции.

Передавать код бессмысленно, т.к. вы не сможете его выполнить. Динамическое выполнение кода в АНК невозможно. Оно реализовано в AutoHotkey_H.

3

Re: AHK: Несколько строк кода, как параметр функции.

ОК. Спасибо. Тогда такой вопрос....  Думал, что с этим то проблем не возникнет, но что то тоже не получается:


interacts(mywintitle)
{
   IfWinExist, mywintitle
   {
       IfWinActive, mywintitle
       {
          return true
       }
   }
}

~1::
if (interacts(Curves) = true)
{
        ControlFocus, PSViewC1, Curves
        ControlSend, PSViewC1, {LAlt Down}, Curves
        ControlSend, PSViewC1, {3}, Curves
        ControlSend, PSViewC1, {LAlt Up}, Curves
}

Так тоже не работает(((
Не подскажите, что сделал не правильно?

4 (изменено: stealzy, 2016-09-20 18:28:28)

Re: AHK: Несколько строк кода, как параметр функции.

Если это ваш полный скрипт, то вы передаете в функцию не инициализированную значением переменную Curves, т.е. пустую.
Проверка IfWinExist бессмысленна, если вы проверяете IfWinActive; также как и равенство в условии if. С таким же успехом можно написать:

if ((interacts(Curves) = true) = true)

5

Re: AHK: Несколько строк кода, как параметр функции.

А зачем тут функции?
Пользуйтесь #IfWinActive.