1 (изменено: mj, 2011-12-01 20:46:13)

Тема: AHK: Загрузка сочетаний из ini файла

Скрипт имеет несколько функций, для каждой можно в настройках задать сочетание клавиш, которое сохраняется в ini-файл по нажатию кнопки "Save_and_Run".
При запуске скрипта из ini-файла загружаются сохраненные сочетания:

IniRead, InfoCheckVar, Refresher.ini, InfoSettings, enable
Gui, Add, CheckBox, vInfoCheck checked%InfoCheckVar% x26 y217 w80 h20 , by button
IniRead, InfoSave, Refresher.ini, InfoSettings, Info , %A_Space%
Gui, Add, Hotkey, vInfo x106 y217 w80 h20 , %InfoSave%
Gui, Add, Button, x326 y247 w90 h20 , Save_and_Run
Gui, Show, x821 y86 h280 w427, AutoTableMove v 1.0
Return

GuiClose:
ExitApp

ButtonSave_and_Run:
	GuiControlGet, InfoCheckVar,, InfoCheck
    IniWrite, %InfoCheckVar%, Refresher.ini, InfoSettings, enable
	GuiControlGet, Info,, Info
	Hotkey, %Info%, RefreshInfo, On
	IniWrite, %Info%, Refresher.ini, InfoSettings, Info
Return

RefreshInfo:
if (InfoCheckVar=0) {
return
} else{
IfWinNotExist, ahk_class TableFrameClass
	return
WinActivate
WinGetPos, , , WidthInfo, HeightInfo, ahk_class TableFrameClass
MouseGetPos, OutputVarX, OutputVarY
SetFormat, float, 0.0
x1 := (WidthInfo * 0.295)
y1 := (HeightInfo * 0.866) 
y2 := (HeightInfo * 0.898) 
SetDefaultMouseSpeed, 0
SetMouseDelay, -1
SendInput, {Click %x1%, %y1%}
SendInput, {Click %x1%, %y2%}
SendInput, {Click %OutputVarX%, %OutputVarY%, 0}
}return

INI-файл соответственно содержит:

[InfoSettings]
enable=1
Info=L

При дефолтном английском языке системы все работает правильно, но если дефолтный русский, то при запуске скрипта поле, содержащее латинские символы, обращается в ноль и при нажатии "Save_and_Run" сообщает об этом:

http://pix.am/G4C5.png

Если переключить на английский, снова назначить на латинском клавишу - все работает, до перезапуска скрипта.

Как лучше всего решить эту проблему? На ум приходит только проверка раскладки на момент запуска скрипта и смена ее.

Попутно пара вопросов:
1) Скрипт не работает, пока не нажмешь клавишу "Save_and_Run", как это обойти?
2) Можно ли сделать сохранение настроек без кнопки, т.е. автоматически при изменении параметров?

Замечания по скрипту приветствуются, опыта в программировании нет.

2

Re: AHK: Загрузка сочетаний из ini файла

Не нашел кнопки "Save"
Не понял предназначение:

IniRead, InfoSave, Refresher.ini, InfoSettings, Info , %A_Space%
Gui, Add, Hotkey, vInfo x106 y217 w80 h20 , %InfoSave%

3

Re: AHK: Загрузка сочетаний из ini файла

creature.ws пишет:

Не нашел кнопки "Save"

Это кнопка Save_and_Run, она одна, исправил пост чтобы было ясно.

creature.ws пишет:

Не понял предназначение:

IniRead, InfoSave, Refresher.ini, InfoSettings, Info , %A_Space%
Gui, Add, Hotkey, vInfo x106 y217 w80 h20 , %InfoSave%

Первая строчка читает значение из файла "Refresher.ini", из категории "InfoSettings" параметра "Info" и посылает его в переменную "InfoSave".
Вторая строчка создает окошко хоткея под ID "Info", с координатами, в себе при создании имеет сочетание из переменной "InfoSave".

Так у меня реализована загрузка сохраненных настроек.

4

Re: AHK: Загрузка сочетаний из ini файла

Теперь понял
Скрипт работает после нажатия Save_and_Run потому как включение горячей клавиши, запускающей «работу» скрипта, происходит после нажатия Save_and_Run.
«Секцию сохранения настроек» можно привязать к g-label hotkey box'а

A g-label such as gMySubroutine may be listed in the control's options. This would cause the MySubroutine label to be launched automatically whenever the user changes the hotkey.

5

Re: AHK: Загрузка сочетаний из ini файла

creature.ws пишет:

Скрипт работает после нажатия Save_and_Run потому как включение горячей клавиши, запускающей «работу» скрипта, происходит после нажатия Save_and_Run.

Попробовал вынести "Hotkey, %Info%, Sample, On" просто в тело скрипта - не работает, как именно надо написать?


creature.ws пишет:

«Секцию сохранения настроек» можно привязать к g-label hotkey box'а

Немного не понял, как это можно использовать? Вот так?


Gui, Add, Hotkey, vInfo gInfoChk x106 y217 w80 h20 , %InfoSave%
Return

InfoChk:
	IniWrite, %Info%, Refresher.ini, InfoSettings, Info
	return

Или как сохранять значение %Info% без ini-файла?

6 (изменено: creature.ws, 2011-12-02 05:13:37)

Re: AHK: Загрузка сочетаний из ini файла

«В тело скрипта» это слишком туманно.
Если требуется что бы хоткей работал сразу после запуска – активацию хоткея необходимо поместить в секцию автовыполнения (до первого Return или метки хоткея)

«Это» можно использовать так же как и с кнопкой Save_and_Run.

Например:


; Сперва читаем сохранённые настройки
IniRead, InfoCheck, Refresher.ini, InfoSettings, enable, 1  ; по умолчанию 1
IniRead, Info,      Refresher.ini, InfoSettings, Info, vk4C ; по умолчанию L=vk4C
; Включем хоткей используя прочтённые (или принятые по умолчанию) значения переменных
Hotkey, ~%Info%, RefreshInfo, On
; Создаём элементы GUI
Gui, Add, CheckBox, vInfoCheck checked%InfoCheck% x26 y217 w80 h20 gInfoCheckChk, by button
Gui, Add, Hotkey, vInfo x106 y217 w80 h20 gInfoChk, %Info%
Gui, Show, x821 y86 h280 w427, AutoTableMove v 1.0
prevInfo := Info
; Конец секции автовыполения
Return
; Метка запускаемая при внесении изменений в hotkey box
InfoChk:
   Hotkey, ~%prevInfo%, off
   prevInfo := Info
   Hotkey, ~%Info%, RefreshInfo, On                    ; Включем новый хоткей
   IniWrite, %Info%, Refresher.ini, InfoSettings, Info ; Записываем внесённые изменения в файл настроек
Return
; Метка запускаемая при активации check box
InfoCheckChk:
   IniWrite, %InfoCheckVar%, Refresher.ini, InfoSettings, enable ; Пишем
Return

RefreshInfo:
if (InfoCheckVar=0) {
   return
} else {
   IfWinNotExist, ahk_class TableFrameClass
       return
   WinActivate
   WinGetPos, , , WidthInfo, HeightInfo, ahk_class TableFrameClass
   MouseGetPos, OutputVarX, OutputVarY
   SetFormat, float, 0.0
   x1 := (WidthInfo * 0.295)
   y1 := (HeightInfo * 0.866) 
   y2 := (HeightInfo * 0.898) 
   SetDefaultMouseSpeed, 0
   SetMouseDelay, -1
   SendInput, {Click %x1%, %y1%}
   SendInput, {Click %x1%, %y2%}
   SendInput, {Click %OutputVarX%, %OutputVarY%, 0}
}
return

GuiClose:
ExitApp

7

Re: AHK: Загрузка сочетаний из ini файла

creature.ws пишет:

«Это» можно использовать так же как и с кнопкой Save_and_Run.

Да, я так и сделал.
Проблема в том, что при сохранении настроек L записывается не как vk4C, а как L, отсюда вся та же проблема:

http://pix.am/EKWU.png

8 (изменено: creature.ws, 2011-12-02 06:31:18)

Re: AHK: Загрузка сочетаний из ini файла

Ну да «та же» проблема может решаться принудительным переключением раскладки для окна скрипта.

9

Re: AHK: Загрузка сочетаний из ini файла

creature.ws пишет:

Ну да «та же» проблема может решаться принудительным переключением раскладки для окна скрипта.

Как бы это и был основной вопрос топика Есть ли простой способ проверить раскладку и переключить ее? Нашел только простыню на хабре.

10

Re: AHK: Загрузка сочетаний из ini файла

Так на основной вопрос я отвечать и не брался
В коллекции имеются примеры  и переключения и определения текущей раскладки.

11

Re: AHK: Загрузка сочетаний из ini файла

Думаю дело не в раскладке, правильней всего было бы сохранение настроек в виде виртуальных клавиш. Не подскажите, как правильней организовать?

12

Re: AHK: Загрузка сочетаний из ini файла

Проверка «правильности» хоткея производится при вводе, до тех пор пока ahk не станет работать исключительно с vk проблемы с «клавиша отсутствует в текущей раскладке» сохранятся.
Для определения vk/sc клавиши есть:

GetKeyName(Key), GetKeyVK(Key), GetKeySC(Key) [v1.1.01+]: Retrieves the name/text, virtual key code or scan code of a key. Key can be a VK or SC code, such as "vkA2" or "sc01D", a combination of both, or a key name.

Но проблему эти функции не решат.

13

Re: AHK: Загрузка сочетаний из ini файла

Почему не решат? Можно записывать, прогнав через GetKeyVK(Key), а читать для отображения в окне контрола через GetKeyName(Key).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: creature.ws, 2011-12-02 23:14:34)

Re: AHK: Загрузка сочетаний из ini файла

Окно контрола msctls_hotkey321 отображает KeyName при использовании vk, в GetKeyName(Key) нет необходимости.
GetKeyVK(Key) не определит vk клавиши отсутствующей в текущей раскладке.
При изменении содержимого hotkey box'а в %info% всё равно содержится  хоткей в английской раскладке.

В таком виде в ini будет сохранён vk клавиши:


; Сперва читаем сохранённые настройки
IniRead, InfoCheck, Refresher.ini, InfoSettings, enable, 1  ; по умолчанию 1
IniRead, Info,      Refresher.ini, InfoSettings, Info, vk4C ; по умолчанию L=vk4C
; Включем хоткей используя прочтённые (или принятые по умолчанию) значения переменных
Hotkey, ~%Info%, RefreshInfo, On
prevInfo := Info
; Создаём элементы GUI
Gui, Add, CheckBox, vInfoCheck checked%InfoCheck% x26 y217 w80 h20 gInfoCheckChk, by button
Gui, Add, Hotkey, vInfo x106 y217 w80 h20 gInfoChk, %Info%
Gui, Show, x821 y86 h280 w427, AutoTableMove v 1.0
; Конец секции автовыполения
Return
; Метка запускаемая при внесении изменений в hotkey box
InfoChk:
   Hotkey, ~%prevInfo%, off
   prevInfo := Key2VK(Info)
   Hotkey, ~%prevInfo%, RefreshInfo, On                    ; Включем новый хоткей
   IniWrite, %prevInfo%, Refresher.ini, InfoSettings, Info ; Записываем внесённые изменения в файл настроек
Return
; Метка запускаемая при активации check box
InfoCheckChk:
   IniWrite, %InfoCheckVar%, Refresher.ini, InfoSettings, enable ; Пишем
Return
 
RefreshInfo:
if (InfoCheckVar=0) {
   return
} else {
   IfWinNotExist, ahk_class TableFrameClass
       return
   WinActivate
   WinGetPos, , , WidthInfo, HeightInfo, ahk_class TableFrameClass
   MouseGetPos, OutputVarX, OutputVarY
   SetFormat, float, 0.0
   x1 := (WidthInfo * 0.295)
   y1 := (HeightInfo * 0.866) 
   y2 := (HeightInfo * 0.898) 
   SetDefaultMouseSpeed, 0
   SetMouseDelay, -1
   SendInput, {Click %x1%, %y1%}
   SendInput, {Click %x1%, %y2%}
   SendInput, {Click %OutputVarX%, %OutputVarY%, 0}
}
return
 
GuiClose:
ExitApp

Key2VK(HotkeyStr)
{
   SetFormat, Integer, H
   Loop, Parse, HotkeyStr
      If A_LoopField Not Contains +,^,!
      {
         Pos := A_Index
         Break
      }
   Return SubStr(HotkeyStr,1,Pos-1) "vk" GetKeyVK(SubStr(HotkeyStr,Pos))
}

//add

В общем, при использовании gui, add, hotkey требуется менять раскладку для окна скрипта на eng.
Если очень хочется использовать editbox для изменения настроек — придётся создать подобие сего контрола корректно работающего в любой раскладке.