1

Тема: AHK: Gui, Add, Hotkey и русский язык

Вот не знаю даже где задать свой вопрос, кроме как в этом разделе. Поискал по сети, покопался в справках, но не нашёл ничего подходящего.

Есть скрипт, в нём задействован gui и используются строки

Gui, Add, Hotkey, vkey
GuiControlGet, key

В системе раскладка по умолчанию, равно как и текущая - русская. Версия Autohotkey - 1.1.24.03. Но почему при вводе значения в поле отображается английский символ нажимаемой клавиши ("N" вместо "Т" или "Q" вместо "Й")? Почему при попытке инициализации строки controlget после указания горячей клавиши (зависящей от раскладки) с русской раскладкой выдаёт ошибку, а сама горячая клавиша остаётся не функциональной? При том, что при английской раскладке те же действия приводят к нужному результату (то есть проблема не в коде). Я что-то не так делаю? Есть какие-то дополнительные параметры или опции при создании hotkey? Как с этим бороться?

2

Re: AHK: Gui, Add, Hotkey и русский язык

Oomniq пишет:

Вот не знаю даже где задать свой вопрос, кроме как в этом разделе.

Странное решение. У нас же есть ветка AHK, почему не там?

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

3

Re: AHK: Gui, Add, Hotkey и русский язык

teadrinker
Я полагал, что там раздел исключительно по программированию, отладке скриптов. У меня так-то вопрос общего характера. Освещение некоторых базовых моментов. Вроде бы нечто такое в этой ветке уже есть, потому  сюда.

4

Re: AHK: Gui, Add, Hotkey и русский язык

Никакой другой из представленных на форуме языков программирования с контролами не работает, так что это вопрос не общего характера, а исключительно по AHK.

По теме — вместо того, чтобы рассуждать, почему какой-то контрол отражает что-либо так, а не иначе, проще будет, если вы поясните, чего именно вы хотите добиться. В таком случае можно будет сказать, возможно ли, и как именно.

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

5

Re: AHK: Gui, Add, Hotkey и русский язык

teadrinker пишет:

...чего именно вы хотите добиться. В таком случае можно будет сказать, возможно ли, и как именно.

Через gui-интерфейс задаётся горячая клавиша. Если назначать независимые от раскладки клавиши, то проблем нет. Если же указать, например, "П" или "Г" (при текущей русской раскладке и по умолчанию она же), то в поле ввода будут отображаться "G" или "U" соответственно, а метка этой клавиши выполняться не будет ни при каких обстоятельствах.
Если перед заданием горячей клавиши сменить текущую раскладку на английскую, то в поле ввода тоже будет отображаться "G" или "U", зато метка будет срабатывать как задумано. Это неудобно на тех компьютерах, где по умолчанию раскладка русская. Себе бы я на скрипт назначал какую-нибудь из F1-12, но пользователю удобнее что-то из группы "над пробелом", вот и захотелось добиться от скрипта какой-то универсальности, но столкнулся с такой проблемой.

6

Re: AHK: Gui, Add, Hotkey и русский язык

Ясно, для начала почитайте тут. Стандартный контрол действительно работает с определёнными недостатками, но у нас разработан альтернативный.

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

7 (изменено: Oomniq, 2016-11-27 11:26:29)

Re: AHK: Gui, Add, Hotkey и русский язык

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

8

Re: AHK: Gui, Add, Hotkey и русский язык

Oomniq, цитировать предыдущий пост не нужно.
Если использовать всё-таки стандартный контрол, то так можно:

Gui, Add, Hotkey, vChosenHotkey
Gui, Add, Button, x+-80 y+5 w80 Default, Submit
Gui, Show
Return

ButtonSubmit:
   GuiControlGet, ChosenHotkey
   sc := GetHotkeySC(ChosenHotkey)
   MsgBox, % sc
   Return
   
GuiClose:
   ExitApp
   
GetHotkeySC(hotkey)  {
   RegExMatch(hotkey, "([!^+#]*)(.*)", key)
   Return key1 . ((StrLen(key2) = 1 || InStr(key2, "Num")) ? Format("sc{:X}", GetKeySC(key2)) : key2)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: serzh82saratov, 2016-11-27 10:50:59)

Re: AHK: Gui, Add, Hotkey и русский язык

teadrinker наверное тоже самое, просто приведу ссылку на вроде такой же вопрос http://forum.script-coding.com/viewtopi … 89#p102089.

Смысл в устранении таких недостатков:
- Буквенные клавиши сохраняются по имени, и потом могут не работать при другой языковой раскладке (есть обходной путь)
***

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

10

Re: AHK: Gui, Add, Hotkey и русский язык

Да, разница только в том, что я здесь скан-коды использую. Виртуальные коды на цифровой клавиатуре зависят от статуса NumLock, а скан-коды всегда одинаковы.

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

11 (изменено: serzh82saratov, 2016-11-27 11:21:23)

Re: AHK: Gui, Add, Hotkey и русский язык

Да ещё и от раскладки, на французкой кажется другие, было обсуждение. Вообщем поправил по ссылке.

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

12

Re: AHK: Gui, Add, Hotkey и русский язык

teadrinker
Теряюсь с блоком GetHotkeySC(hotkey). Не до конца понимаю что именно в нём происходит.
Скрипт изъял сканкод клавиши. Как теперь поставить на него метку?

Hotkey, % sc, label

Вроде же как-то иначе?

...могут не работать при другой языковой раскладке...

В моём случае как раз наоборот: буквенные клавиши работают при другой (в английской) раскладке. Или я не так истолковал слово "другая"? "Другая" = "не по умолчанию"?

13

Re: AHK: Gui, Add, Hotkey и русский язык

Oomniq пишет:

Теряюсь с блоком GetHotkeySC(hotkey). Не до конца понимаю что именно в нём происходит.

Здесь с помощью RegExMatch вычленяем из полученного текста две части: первая — модификаторы, вторая — клавиша.
Например, из контрола Hotkey пришёл текст ^!+ю. Тогда в переменной key1 будет ^!+, а в переменной key2 — ю. Далее с помощью GetKeySC() получаем сканкод клавиши ю и форматируем его в шестнадцатеричное значение. Затем соединяем вместе модификаторы и полученный сканкод.

Oomniq пишет:

Скрипт изъял сканкод клавиши. Как теперь поставить на него метку?

Gui, Add, Hotkey, vChosenHotkey
Gui, Add, Button, x+-80 y+5 w80 Default, Submit
Gui, Show
Return

ButtonSubmit:
   GuiControlGet, ChosenHotkey
   sc := GetHotkeySC(ChosenHotkey)
   Hotkey, % sc, Label, On
   Return
   
Label:
   MsgBox, Работает!
   Return
   
GuiClose:
   ExitApp
   
GetHotkeySC(hotkey)  {
   RegExMatch(hotkey, "([!^+#]*)(.*)", key)
   Return key1 . ((StrLen(key2) = 1 || InStr(key2, "Num")) ? Format("sc{:X}", GetKeySC(key2)) : key2)
}
Oomniq пишет:

В моём случае как раз наоборот: буквенные клавиши работают при другой (в английской) раскладке. Или я не так истолковал слово "другая"? "Другая" = "не по умолчанию"?

В общем, неважно, на разных машинах может работать по-разному. Смысл в том, что буквенные клавиши лучше задавать через VK или SC коды.

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