1

Тема: AHK: Смена режима выполнения команды

Хотелось бы иметь сценарий, где одна и та же горячая клавиша выполняет различные действия, в зависимости от заданного режима. Например, по нажатию Ctrl + Shift + 1 включается режим, при котором нажатие клавиши "1" вызывает окно с сообщением "Один", а при нажатии Ctrl + Shift + 2 включается режим, при котором нажатие клавиши "1" вызывает окно с сообщением "Два". Важно, чтобы заданный режим сохранялся и при перезагрузке самого сценария. Как это можно реализовать?

Извиняюсь, если информация уже была изложена на форуме. Могу не знать тегов, соответствующих данной теме.

2

Re: AHK: Смена режима выполнения команды

Так можно:

OnExit, Exit
FileRead, mode, mode.txt

^+1::
mode := 1
return
^+2::
mode := 2
return

#If mode = 1
1:: msgbox 1
#If mode = 2
1:: msgbox 2
#If

Exit:
FileDelete, mode.txt
FileAppend, %mode%, mode.txt
ExitApp

3 (изменено: becauseim, 2015-11-08 05:48:18)

Re: AHK: Смена режима выполнения команды

Malcev, спасибо! Работает, позже попробую применить его в практике. А насколько реально осуществить метод без создания текстового файла?

4

Re: AHK: Смена режима выполнения команды

Можно в реестр записывать.

5

Re: AHK: Смена режима выполнения команды

Malcev, могли бы Вы отобразить такой метод? Я нашел команды RegRead и RegWrite, но верно их использовать не удалось. На всякий случай, замечу, что рассчитываю использовать несколько таких параметров в одном файле скрипта.

6

Re: AHK: Смена режима выполнения команды

Можно хранить состояние переменных в самом скрипте, если он не скомпилирован в EXE.
В список My_StaticVars занеси те переменные, значения которых должны сохраняться между запусками.
В моем примере это mode (режим) и nClick - количество нажатий ЛКМ во время работы скрипта.

OnExit, Exit
My_StaticVars := {mode: "1", nClick: "0"}
for k,v in My_StaticVars
   %k% := v
Return

^+1::
mode := 1
return
^+2::
mode := 2
~*LButton:: nClick++
return

#If mode = 1
1:: MsgBox % "1: " nClick
#If mode = 2
1:: MsgBox % "2: " nClick
#If

Exit:
   tmpfile := A_ScriptDir . "\_" . A_Now . ".tmp"
   newvars := "My_StaticVars := {"
   for k,v in My_StaticVars
      newvars .= k . ": """ . %k% . """, "
   newvars := SubStr(newvars,1, -2) . "}"
   Loop, Read, %A_ScriptFullPath%, %tmpfile%
	  if (InStr(A_LoopReadLine, "My_StaticVars :=") = 1)
	     out .= newvars "`n"
	  else
	     out .= A_LoopReadLine "`n"
   FileDelete, %A_ScriptFullPath%
   FileAppend, %out%, %A_ScriptFullPath%
ExitApp

7

Re: AHK: Смена режима выполнения команды

Не проще использовать методы ини файлов?


/*
[Section]
Key1=0 
*/ 
IniRead, Key1, %A_ScriptFullPath%, Section, Key1  
MsgBox % Key1
IniWrite, % ++Key1, %A_ScriptFullPath%, Section, Key1
Reload
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Alectric, 2015-11-08 14:42:03)

Re: AHK: Смена режима выполнения команды

AHK: Удобный метод сохранения,загрузки настроек в реестре

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

9

Re: AHK: Смена режима выполнения команды

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

Exit:
   tmpfile := A_ScriptDir . "\_" . A_Now . ".tmp"
   newvars := "My_StaticVars := {"
   for k,v in My_StaticVars
      newvars .= k . ": """ . %k% . """, "
   newvars := SubStr(newvars,1, -2) . "}"
   Loop, Read, %A_ScriptFullPath%, %tmpfile%
	  if (InStr(A_LoopReadLine, "My_StaticVars :=") = 1)
	     out .= newvars "`n"
	  else
	     out .= A_LoopReadLine "`n"
   FileDelete, %A_ScriptFullPath%
   FileAppend, %out%, %A_ScriptFullPath%
ExitApp 

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

10 (изменено: serzh82saratov, 2015-11-08 23:20:55)

Re: AHK: Смена режима выполнения команды

becauseim пишет:

Ваш способ также предполагает создание файла с содержанием настроек?

Нет, он предполагает наличие многострочного комментария в начале скрипта.


/*
[Section]
mode=1
[End]
*/ 

IniRead, mode, %A_ScriptFullPath%, Section, Mode 

^+1:: IniWrite, % (mode := 1), % A_ScriptFullPath, Section, Mode 
^+2:: IniWrite, % (mode := 2), % A_ScriptFullPath, Section, Mode

#If mode = 1
1:: msgbox 1
#If mode = 2
1:: msgbox 2
#If
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Смена режима выполнения команды

becauseim пишет:

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

Мой код, т.е. первые 4 строки, и последние от метки Exit: - добавляются один раз соответственно в начало и конец вашего скрипта, и служат лишь для хранения переменных между запусками скрипта. А окна, сценарии и прочее - это на ваше усмотрение.

P.S. Кстати, советую обратить внимание на вариант, который предложил serzh82saratov, хоть такое совмещение  и не описано в справке, это проще и удобней. Единственно, что запись переменных я бы делал один раз по выходу из скрипта, а не каждый раз при изменении значения переменной.

12 (изменено: serzh82saratov, 2015-11-08 23:24:50)

Re: AHK: Смена режима выполнения команды

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

Irbis пишет:

Единственно, что запись переменных я бы делал один раз по выходу из скрипта

Это по вкусу. Вдруг например процесс прибьют, а инфо нужное.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Смена режима выполнения команды

Спасибо! Последний предложенный метод более лаконичен и понятен для редактирования. Однако при попытке связать его с этим сценарием возникает ошибка о повторяющихся лейблах. Как же задать два режима для лейбла F2_1 ?

14

Re: AHK: Смена режима выполнения команды

Как же задать два режима для лейбла F2_1 ?

Может в лейбле проверять mode? Иначе вопрос не ясен.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Смена режима выполнения команды

serzh82saratov, отправляются поочередно оба сообщения, вне зависимости от смены режима. Сам режим сменяется, заметно по изменению текста  (mode = 1/2).


F2_1:
#if mode = 1
msgbox 1
#if mode = 2
msgbox 2

16

Re: AHK: Смена режима выполнения команды

Нда, когда очень хочется, значение закорючек не играет роли.

F2_1:
	if mode = 1
		msgbox 1
	else if mode = 2
		msgbox 2
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Смена режима выполнения команды

serzh82saratov, не совсем понял, что Вы имели в виду. Исправил. выходит: Else with no matching IF

18 (изменено: becauseim, 2015-11-09 03:14:04)

Re: AHK: Смена режима выполнения команды

Извиняюсь, ошибки уже нет. Кажется, разобрался.

19

Re: AHK: Смена режима выполнения команды

serzh82saratov, как задать условие выполнения комманды сразу в двух режимах? Иными словами, как локаничнее изобразить следующее:

1:
	if mode = 1
		tooltip 1
	else if mode = 2
		tooltip 2
	else if mode = 3
		tooltip 2
	Return

20

Re: AHK: Смена режима выполнения команды


1:
    if mode = 1
        tooltip 1
    else if (mode = 2) or (mode = 3)
        tooltip 2
    Return

21

Re: AHK: Смена режима выполнения команды

Переключение режимов работает, но условие не срабатывает. Подскажите, пожалуйста, где ошибка?


IniRead, ar, Settings.ini, Section, ar

f2:: ; r
If toggle := !toggle {
	IniWrite, off, Settings.ini, Section, ar
} Else {
	IniWrite, on, Settings.ini, Section, ar
}
return

f1:: 
if ar = on
	tooltip on
else
	tooltip off
return 

22

Re: AHK: Смена режима выполнения команды

Потому что от записи в файл, переменная не изменится.


f1:: 
IniRead, ar, Settings.ini, Section, ar
if ar = on
	tooltip on
else
	tooltip off
return 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui