1 (изменено: Indomito, 2012-03-03 23:08:52)

Тема: AHK: Проблемы с русским языком

Итак, сабж.

Читая Документация по программе AutoHotkey и chm на русском я натолкнулся на то что AutoHotkey плохо понимает русский язык, т.е. нажатие клавиши в русской раскладке и были указаны методы борьбы с этим от написания спец. скрипта до использования AutoHotkey версии BASIC, правда последняя плохо работает с системами x64 и UTF + имеет ряд ограничений.

Вопрос чисто теоретический, но и не хотелось бы наткнуться на баг в своём скрипте.

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

Это я читал AutoHotkey и русский язык – дружба навеки, но датировка от 2006 года меня смущает, нажав на новую версию и прочитав AutoHotkey и русский язык – дружба навеки (версия 4 от 13 июля 2006 г.), ну разница не большая, т.к. тот же 2006 год.

P.S. Кода-скрипта как такового нет, вопрос на будущее.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2 (изменено: creature.ws, 2012-03-03 23:14:42)

Re: AHK: Проблемы с русским языком

Проблем нет, но вас это черезвычайно волнует?

3

Re: AHK: Проблемы с русским языком

Да, есть такое

Ну скажем...
При нажатии на клавишу й должно напечататься q или же наоборот, например через send в noterad-е.

Я не проверял, но такое сработает?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: AHK: Проблемы с русским языком

Предполагается, что кто-то протестирует предложенной действие и отчитается о результате? увольте

5

Re: AHK: Проблемы с русским языком

Indomito пишет:

Вопрос чисто теоретический, но и не хотелось бы наткнуться на баг в своём скрипте.

Наткнувшись и не решив, Вы всё равно поищите ответ тут, тогда к чему вся эта теория?, конкретная задача - вот, что интересно в плане решения (ИМХО).

6

Re: AHK: Проблемы с русским языком

нет, не надо просто надо просто знать что это должно работать - протестирую я сам.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7

Re: AHK: Проблемы с русским языком

Grey я понял ошибку свою.... напишу скрипт и спрошу.

Да, вопрос - Как определить текущую раскладку En - Ru, а?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

8

Re: AHK: Проблемы с русским языком

Space::
   MouseGetPos,,, WinID
   ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID
                                               , "UInt", 0)
   LocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID)
   Bool:=LocaleID=0x4090409
   MsgBox, % Bool ? "En":"Ru"
   Return

9

Re: AHK: Проблемы с русским языком

Grey ндяяя... а можно как фрагмент скрипта, т.е. как функцию которая возвращает текущую раскладку?
Просто я попытался и потерпел фиаско

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

10

Re: AHK: Проблемы с русским языком

Space::TrayTip,, % InputLayout()

InputLayout()
{
   ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinExist("A")
                                               , "UInt", 0)
   LocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID)
   Return, LocaleID&0x10 ? "Ru":"En"
;   Return, LocaleID>>4&1 ? "Ru":"En"
}
Space::TrayTip,, % InputLayout()

InputLayout()
{
   ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinExist("A")
                                               , "UInt", 0)
   LocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID)
   VarSetCapacity(sKbd, 260, 0)
   DllCall("GetLocaleInfo", "UInt", LocaleID&0xFFFF
                          , "UInt", 0x1001
                          , "Str", sKbd
                          , "UInt", 260)
   Return, SubStr(sKbd, 1, 2)
}

11

Re: AHK: Проблемы с русским языком

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

12 (изменено: Indomito, 2012-03-05 07:16:53)

Re: AHK: Проблемы с русским языком

И так, не мудрствуя лукаво, я написал

Й::
send, Q

и получил ошибку -

http://i5.pixs.ru/storage/4/4/2/2png_2723514_4190442.png

Как обойти это?

P.S. Смысл то ошибки понятен, т.е. переводить его не нужно

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

13

Re: AHK: Проблемы с русским языком

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

vk51:: Send, Q

AutoHotkey: Начинающему разработчику - Печатаю виртуальными кодами
Виртуальные коды клавиш

14

Re: AHK: Проблемы с русским языком

Спасибо.
Значит надо не просто указывать виртуальный код клавиши, но и делать проверку до отправки по Send как написано в посте #10, да?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

15

Re: AHK: Проблемы с русским языком

Смотря в чём ваша цель заключается. Код выше печатает Q при любой раскладке. Вы чего хотите добиться и где именно?

16

Re: AHK: Проблемы с русским языком

Я хочу добиться замены ЗЫ на P.S.  и PS на P.S., т.е. задача сводиться к обработке фрагментов слов Что То Набрано нажат Пробел = Проверка и если надо то замена.
Для меня важна не только текущая раскладка, но и регистр. Происходит обработка всех нажатых клавиш с учётом Раскладка+Регистр.

Да, как понять разницу между q и Q, т.к. скан-код у них одинаковый и равен 51, а?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

17

Re: AHK: Проблемы с русским языком

Тогда проще использовать строки автозамены.

::ЗЫ::P.S.
::PS::P.S.

18

Re: AHK: Проблемы с русским языком

Но это константное действие, если замена зависит от постобработки?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

19

Re: AHK: Проблемы с русским языком

Не понял вопрос.

20 (изменено: Indomito, 2012-03-05 10:57:58)

Re: AHK: Проблемы с русским языком

Я имею ввиду что выражение

::ЗЫ::P.S.

сработает всегда, а если нужно сначала провести анализ, а уж потом проводить замену.

P.S. Много вариантный скажем IF не подойдёт, т.к. будет очень громоздкая конструкция.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

21

Re: AHK: Проблемы с русским языком

Какой анализ и для чего?

22 (изменено: Indomito, 2012-03-05 11:09:10)

Re: AHK: Проблемы с русским языком

Для той же замены.
1. Отлавливаются сканкоды с учётом текущей раскладки+регистра и помещаются в переменную.
2. При нажатии предопределённой клавиши проводиться анализ содержимого переменной.
3. На основе проведённого анализа выполняются т.е. или иные действия и не обязательно замена.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

23

Re: AHK: Проблемы с русским языком

Понятно, но с учётом этого:

P.S. Много вариантный скажем IF не подойдёт, т.к. будет очень громоздкая конструкция.

не представляю, как вы хотите это всё воплотить. Команда "сделай то, о чём я думаю" в АНК пока что отсутствует.

24 (изменено: Indomito, 2012-03-05 11:20:30)

Re: AHK: Проблемы с русским языком

Просто я не представляю/не знаю как динамически менять конструкцию типа

::ЗЫ::P.S.

т.к. надо сначала проверять, а потом делать замену.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

25

Re: AHK: Проблемы с русским языком

Вот про что -

Ссылки на переменные, такие, как %MyVar%, в настоящее время не поддерживаются внутри текста замены. Чтобы обойти это препятствие, не делайте подобные строки простой автозаменой. Вместо этого используйте команду Send, которую поместите под аббревиатурой.

Как правильно написать конструкцию типа

::%MyVar0%::%MyVar1%

просто из примера в chm-файле я этого не понял.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

26

Re: AHK: Проблемы с русским языком

Понятия не имею, как её написать. Вы что-то очень сложное задумали, мне малопонятное, при том что знаний у вас, я так понимаю, ещё очень мало, так что вам даже трудно объяснить, что вы сделать хотите. Может, не надо торопиться писать мегауниверсальный код на все случаи жизни, а сначала разобраться с АНК на чём-то более простом.

Или хотя бы сформулируйте задачу более конкретно в стиле: когда я делаю то-то и то-то, дожно происходить то-то и то-то. А то на абстрактные вопросы сложно отвечать.

27

Re: AHK: Проблемы с русским языком

1. Получаю скан-код.  Это знаю как.
2. Проверяю текущую раскладку.  Это знаю как.
3. Проверяю/узнаю регистр.  Это НЕ знаю как.
4. Конвертирую скан-код с учётом №2 и №3 в букву. Сам разберусь это не сложно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

28

Re: AHK: Проблемы с русским языком

Скан-код откуда берёте?

29 (изменено: Indomito, 2012-03-05 13:39:38)

Re: AHK: Проблемы с русским языком

По аналогии с AutoHotkey: Начинающему разработчику - Печатаю виртуальными кодами
Конечно можно отлавливать удержание Shift (левый и правый) и статус CapsLock, просто я думал что в AHK есть готовая реализация.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

30

Re: AHK: Проблемы с русским языком

Можно так:

A = P.S.
B = p.s.

::ЗЫ::
::PS::
if (Capitals())
Send %A%
else
Send %B%
return

Capitals()
{
  return GetKeyState("Capslock", "T")  ? !GetKeyState("Shift", "P") : GetKeyState("Shift", "P")
}

Будет печатать переменную A или B в зависимости от регистра, но при любой раскладке клавиатуры. В if ... else можно ввести любые дополнительные условия проверки.

31

Re: AHK: Проблемы с русским языком

Irbis спасибо я это и по сути спрашивал, но видимо не верно формулировал.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

32 (изменено: Grey, 2012-03-05 21:14:38)

Re: AHK: Проблемы с русским языком

:b*c1:зы::
:b*c1:ps::
   CheckAll(A, B, C)
   Send, % ((A&&!B)||(!A&&B) ? "+":"")"{vk50}{vkB"C "}"
         . ((A&&!B)||(!A&&B) ? "+":"")"{vk53}{vkB"C "}"
   Return

CheckAll(ByRef CState, ByRef SState, ByRef Lang)
{
   CState:=GetKeyState("CapsLock", "T") ? 1:0
   SState:=GetKeyState("Shift", "P") ? 1:0
   Lang:=DllCall("GetKeyboardLayout", "UInt"
 , DllCall("GetWindowThreadProcessId", "UInt", WinExist("A")
                                     , "UInt", 0))>>4&1
                                     ? "F":"E"
}

33

Re: AHK: Проблемы с русским языком

Grey я смотрю ты дописываешь код. А можно в него добавить комментарии или же просто линки на описание?
Мне очень непонятна конструкция 

:b*c1:зы::
:b*c1:ps::
{
   CheckAll(A, B, C)
   Send, % ((A&&!B)||(!A&&B) ? "+":"")"{vk50}{vkB"C "}"
         . ((A&&!B)||(!A&&B) ? "+":"")"{vk53}{vkB"C "}"
}
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

34 (изменено: Grey, 2012-03-05 21:15:10)

Re: AHK: Проблемы с русским языком

Выше несколько другой вариант, вот по теме:

:b*c1:зы::
:b*c1:ps::
   CheckAll(A, B)
   SendRaw, % ((A&&!B)||(!A&&B) ? "P.S.":"p.s.")
   Return

CheckAll(ByRef CState, ByRef SState)
{
   CState:=GetKeyState("CapsLock", "T") ? 1:0
   SState:=GetKeyState("Shift", "P") ? 1:0
}

A - состояние CapsLock, B - состояние Shift.

35

Re: AHK: Проблемы с русским языком

Поясни плиз это фрагмент

:b*c1:зы::
:b*c1:ps::

упоминание в CHM-файле я видел, но там не очень понятно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

36 (изменено: creature.ws, 2012-03-05 20:44:34)

Re: AHK: Проблемы с русским языком

Мне очень непонятна конструкция

Ответы в справке: Operators in Expressions, Hotstrings.
Для справки - практически все ответы на подобные вопросы в справке

37

Re: AHK: Проблемы с русским языком

Увы, но там не те ответы, то что в  Operators in Expressions это банально, ну просто не очень отличается от других языков, а мне же непонятны некоторые тонкости.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

38

Re: AHK: Проблемы с русским языком

Так конкретизируйте Или вы желаете чтоб вам пересказали справку своими словами?

39 (изменено: Indomito, 2012-03-05 20:57:50)

Re: AHK: Проблемы с русским языком

Ну я же написал фрагмент который мне непонятен. Вот

:b*c1:зы:: <---это, а точнее :b*c1
:b*c1:ps::
{ <------- зачем?
   CheckAll(A, B)
   SendRaw, % ((A&&!B)||(!A&&B) ? "P.S.":"p.s.")
} <------- зачем? Я понимаю, что закрывается, но какой смысл описательный?
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

40 (изменено: creature.ws, 2012-03-05 20:57:46)

Re: AHK: Проблемы с русским языком

Ах, вопрос оказывается о скобочках, ответить не смогу, увы.

41 (изменено: Indomito, 2012-03-05 20:59:42)

Re: AHK: Проблемы с русским языком

А про первую строчку? Ну вторая то аналогична это понятно... по кускам в справке есть, а вот в целом я не могу понять.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

42

Re: AHK: Проблемы с русским языком

А первая строчка по ссылке Hotstrings объясняется.

43 (изменено: Indomito, 2012-03-05 21:15:13)

Re: AHK: Проблемы с русским языком

Прочитал правда русскую справку, да вроде бы всё понятно, но вот если вместе то не понятно. Я про b*c1

B0 (за буквой B идет цифра 0): стирание (автоматический забой) напечатанной вами аббревиатуры не производится. Чтобы снова включить ранее выключенный забой, используйте просто символ B (без цифры 0).

* (звездочка): для того, чтобы запустить строку автозамены, конечный символ (пробел, точка или перевод строки) не требуется. Чтобы выключить эту опцию, используйте символы *0. В следующем примере замена происходит в момент печатания символа @.

C1: не подчиняется регистру, используемому при наборе текста. Используйте эту опцию для того, чтобы простая автозамена не зависела от регистра, а также, чтобы она не подчинялась регистру символов, которые вы фактически печатаете. Чтобы строки автозамены снова подчинялись регистру, используйте символы C0. Подчиняющиеся регистру строки автозамены заменят аббревиатуру, напечатанную заглавными буквами, на текст, также напечатанный заглавными буквами. Если только первая буква аббревиатуры будет заглавной, соответственно только первая буква в тексте замены будет заглавной (если это буква). В каком регистре бы вы не печатали, текст замены будет напечатан точно так, как это определено.

но если сложить всё вместе, то не понятно становится.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

44

Re: AHK: Проблемы с русским языком

Ну да, фигурные скобки не нужны (поправил посты). В остальном тема раскрыта?

45 (изменено: Indomito, 2012-03-05 21:32:06)

Re: AHK: Проблемы с русским языком

Осталось только понять b*c1, а точнее :b*c1:зы:: и ещё можно ли вместо зы написать переменную, а?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download