1 (изменено: Antant, 2013-07-10 15:57:14)

Тема: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Приветствую, уважаемые коллеги.

Ситуация:
Есть приложение, в котором не работает русская клавиатура (текст в русской раскладке не вводится, в связи подменой таблицы символов в приложении), но работает вручную введенные ASCII значения из таблицы №4 данного документа: http://ascii.org.ru/ascii.pdf

Сделал для всех буквенных клавиш переназначение. Ниже привожу пример на примере букв "Ы" и "ы".


+s::
SetKeyDelay 25, 25, Play
SendPlay {ASC 0219} ;
return

s::
SetKeyDelay 25, 25, Play
SendPlay {ASC 0251} ;
return

Заранее прошу прощения за возможную безграмотность и/или не правильную реализацию, только начал изучать AHK.

Прежде чем продолжить, хочу сказать что:

  • Использую Win7 32 bit - это важно.

  • Версия Autohotkey 1.1.11.01 (последняя).

  • Раскладка по умолчанию EN.

  • В системе кодировка Win 1251.

У меня данный скрипт работает, только если включена английская раскладка клавиатуры (EN).
У товарища при тех же условиях, на Win7 64 bit не работает.

Все попытки заставить скрипт работать на русской раскладке клавиатуры и Win7 64 bit провалились.

Ни сохранение в UTF-8, ни использование через скан-код (sc) не помогли, в любой раскладке и экспериментах отрабатываются только латинские символы. Советы из статьи http://www.script-coding.com/AutoHotkey … an_3b.html тоже не помогли. Т.е. даже элементарная замена:

Буква Ы::Буква Г
Буква Г::Буква Ы

возвращали в русской раскладке "s" и "u" (Слово буква в данном примере для наглядности).

Буду очень признателен если поможете решить задачу:
Только при включенной русской раскладке (RU) нажатие клавиши вызывало "ASC xxxx", при этом скрипт не отрабатывался при английской раскладке, возможно существует условие проверки текущей раскладки. Ну и  чтобы одинаково хорошо работало в Win 32 и 64.

Возможно нужно подкорректировать мой код или же Вы предложите более эстетичное решение.
В любом случае буду признателен за работающий пример на паре символах.
Заранее благодарю и надеюсь на Вашу помощь.

2

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Возможно, дело не в битности, а в том, что у вас UAC отключен, а у товарища нет. При включенном UAC у SendPlay возникают проблемы.

У меня данный скрипт работает, только если включена английская раскладка клавиатуры (EN).

В каком смысле работает? Печатаются русские буквы?

3 (изменено: serzh82saratov, 2013-07-10 12:28:15)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Может просто надо записать ГК как:


vk53::
+vk53::

Ведь запись символьных клавиш в виде символов неправильна. И иногда вылетает ошибка:

Note: The hotkey s:: will not be active because it does not exist in the current keyboard layout.

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

4

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

YMP пишет:

Возможно, дело не в битности, а в том, что у вас UAC отключен, а у товарища нет. При включенном UAC у SendPlay возникают проблемы.

У меня данный скрипт работает, только если включена английская раскладка клавиатуры (EN).

В каком смысле работает? Печатаются русские буквы?

Да печатаются русские буквы. Печатаются при английской раскладке, т.к. она установлена по умолчанию (я вычитал в документации, что autohotkey всегда отталкивается от раскладки по умолчанию).

serzh82saratov пишет:

Может просто надо записать ГК как:


vk53::
+vk53::

Ведь запись символьных клавиш в виде символов неправильна. И иногда вылетает ошибка:

Note: The hotkey s:: will not be active because it does not exist in the current keyboard layout.

Спасибо попробую "vk" - кстати не подскажете, где можно найти полные таблицы соответствий "vk" и "sc", т.е. какой клавише какой код соответствует?

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

Возможно существует аналог команды для раскладки:

ifwinactive

например:

ifАКТИВНАРУССКАЯРАСКЛАДКАКЛАВИАТУРЫ

Повторюсь - скрипт должен работать на любой раскладке по умолчанию установленной в системе и только когда включена русская раскладка.

P.S. Также буду признателен за оценку выбора комманд в моем примере, просто не исключаю, что есть более простое,  лаконичное или правильное решение. Еще раз спасибо всем ответившим.

5

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Antant пишет:

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

Погодите, а язык ввода у окна, куда посылаются буквы, при этом какой? От него зависит работа или неработа скрипта или от того, какая в системе раскладка по умолчанию?

Virtual Key Codes

6

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

кстати не подскажете, где можно найти полные таблицы соответствий "vk" и "sc", т.е. какой клавише какой код соответствует?

Я этим пользуюсь http://forum.script-coding.com/viewtopi … 459#p72459 для буковок.

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

Увы, но до конца немогу понять вашу проблему.

Возможно существует аналог команды для раскладки:

Space::
    If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0")) = 0x4190419
        MsgBox Рус
    Else
        MsgBox Eng 
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Может просто так

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

8

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Antant, ознакомьтесь с этой темой, отредактируйте заголовок.

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

9

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

teadrinker пишет:

Antant, ознакомьтесь с этой темой, отредактируйте заголовок.

Добавил AHK:, спасибо.

10

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

YMP пишет:
Antant пишет:

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

Погодите, а язык ввода у окна, куда посылаются буквы, при этом какой? От него зависит работа или неработа скрипта или от того, какая в системе раскладка по умолчанию?

Действительно путанница. В моем случае окно активно и если раскладка RU или UA, то скрипт не отрабатывается, если раскладка EN - работает. Я запустил в оконном режиме - раскладка системы и окна приложения одинаковая.

Учтите, что скрипт по нажатию клавиши отправляет комбинацию клавишь, которые подставляют ANCII значение из таблицы символов которые в этом приложении используются. Фактически я хочу напечатать русскую букву "Ы" и при нажатии отправляется Alt+0219. В приложении это работает, при этом в блокноте эта комбинация выдает букву ?"?".

11 (изменено: Antant, 2013-07-10 16:11:19)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

serzh82saratov пишет:

Может просто так

Сохранял в UTF-8 - не помогает, я эту статью читал. Или Вы имели ввиду переменные, которые там используются.

12 (изменено: Antant, 2013-07-10 16:31:33)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

serzh82saratov пишет:

   


If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0")) = 0x4190419
        MsgBox Рус
    Else
        MsgBox Eng 
Return

Очень близко к тому что я ищу. Вас не затруднит написать пример, чтобы скрипт отрабатывался только при активной русской раскладке?

Вот пример когда мой скрипт отрабатывется только в окне notepad`a:


#IfWinActive notepad

+vk53::
SetKeyDelay 25, 25, Play
SendPlay {ASC 0219} ;
return

vk53::
SetKeyDelay 25, 25, Play
SendPlay {ASC 0251} ;
return

Что нужно написать вместо "#IfWinActive notepad" чтобы он проверял, что раскладка русская и не отрабатывал в других раскладках?

Заранее спасибо!

13

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

YMP пишет:

Возможно, дело не в битности, а в том, что у вас UAC отключен, а у товарища нет. При включенном UAC у SendPlay возникают проблемы.

Порекомендуйте команду, у которой нет данной проблемы.

14

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

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

SendInput {Raw}

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

15 (изменено: Irbis, 2013-07-10 18:26:13)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Antant пишет:

Что нужно написать вместо "#IfWinActive notepad" чтобы он проверял, что раскладка русская и не отрабатывал в других раскладках?

SetKeyDelay 25, 25, Play
Return

#If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId"
             , "Int", WinExist("A"), "Int", "0")) = 0x4190419
+vk53:: SendPlay {ASC 0219}
vk53:: SendPlay {ASC 0251}
#If

P.S.: У меня в Notepad++ с SendPlay не работает, но работает с SendInput

16

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

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

17

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Irbis пишет:
Antant пишет:

Что нужно написать вместо "#IfWinActive notepad" чтобы он проверял, что раскладка русская и не отрабатывал в других раскладках?

SetKeyDelay 25, 25, Play
Return

#If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId"
             , "Int", WinExist("A"), "Int", "0")) = 0x4190419
+vk53:: SendPlay {ASC 0219}
vk53:: SendPlay {ASC 0251}
#If

P.S.: У меня в Notepad++ с SendPlay не работает, но работает с SendInput

Ура, получилось! Буду тестировать на других машинах. Причем и SendPlay и SendInput работают.

Громадное спасибо всем ответившим. После тестирования на других машинах отпишусь.

18

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Всё хорошо, что хорошо кончается. Но в чём была проблема, мне так и осталось непонятным. Раз дефолтная кодировка английская, хоткеи должны работать и с буквенными именами. А больше никакой разницы я не вижу.

19

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

YMP пишет:

Всё хорошо, что хорошо кончается. Но в чём была проблема, мне так и осталось непонятным. Раз дефолтная кодировка английская, хоткеи должны работать и с буквенными именами. А больше никакой разницы я не вижу.

Ларчик не так просто открывался. Вся проблема была в том, что

 ASC xxxx

отрабатывается только в раскладке по умолчанию. Плюс нужно было универсальное решение для пользователей c UAC и без UAC, т.е. от SendPlay и SendInput отваливаются из-за громоздкого скрипта, пришлось оставить Send

Методом проб и ошибок получился вот такой монстр (на примере 1 печатного символа), а всего их около 80:

#If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0")) = 0x4190419
+vk37::
SendMessage, 0x50,, 0x4090409
Send {ASC 0063}
Sleep, 25
SendMessage, 0x50,, 0x4190419
#If
Return

Но, зараза такая, перестали работать #ifwinactive и winwait, скорее всего потому что уже есть #If.

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

20

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Условия можно комбинировать.

#If WinActive("ahk_class Notepad") and DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)) = 0x4190419

+vk37::
SendMessage, 0x50,, 0x4090409
Send {ASC 0063}
Sleep, 25
SendMessage, 0x50,, 0x4190419
Return

#If

21 (изменено: serzh82saratov, 2013-07-11 18:59:23)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Методом проб и ошибок получился вот такой монстр (на примере 1 печатного символа), а всего их около 80

По идее такой код может сократить решение:


Keys := {"vk53": "0251", "+vk53": "0219"}
#If MyCondition()
#If 
HotKey, If, MyCondition()
For k in Keys
   HotKey, %k%, Асtion
HotKey, If
Return 

Асtion:
    SendMessage, 0x50,, 0x4090409
    Send % "{ASC " Keys[A_ThisHotkey] "}"
    Sleep, 25
    SendMessage, 0x50,, 0x4190419
    Return 
 
MyCondition()      {
    Return WinActive("ahk_class Notepad++") && DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)) = 0x4190419 
} 

вот только непойму почему оно выдаёт ошибку?

Error:  Parameter #2 must match an existing #If expression.

Line#
009: Keys := {"vk53": "0251", "+vk53": "0219"}
---> 010: Hotkey,If,MyCondition()

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

22

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

вот только непойму почему оно выдаёт ошибку?

Разобрался

Выражение должно точно соответствовать тексту существующей #If

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

23

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

serzh82saratov пишет:

вот только непойму почему оно выдаёт ошибку?

Разобрался

Выражение должно точно соответствовать тексту существующей #If

А как это исправить в Вашем примере? И еще раз спасибо.

24 (изменено: serzh82saratov, 2013-07-11 20:10:50)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Уже исправлено в #21.
Вам осталось только дописать массив Keys для остальных кнопок.

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

25

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

serzh82saratov пишет:

Уже исправлено в #21.
Вам осталось только дописать массив Keys для остальных кнопок.

Громадное спасибо всем, особенно serzh82saratov и YMP ! К сожалению ни в одном из примеров WinActive и #If WinActive не заработали в моем приложении, в блокноте и блокноте++ условие работает. Но на данном этапе это не так важно, буду признателен, если ткнёте носом покурить мануал, в каких условиях он может не работать.

26 (изменено: serzh82saratov, 2013-07-12 20:12:48)

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

в каких условиях он может не работать.

Думаю что ни в каких. У вас неправильно заданы критерии определения окна. В 6 посте ссылка на скрипт. Скриншот окон вместе приведите. И пример как пишите #If WinActive. Точнее WinActive("???").

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

27

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

serzh82saratov пишет:

в каких условиях он может не работать.

Думаю что ни в каких. У вас неправильно заданы критерии определения окна. В 6 посте ссылка на скрипт. Скриншот окон вместе приведите. И пример как пишите #If WinActive. Точнее WinActive("???").

??? = наименование процесса без ".exe"

Брал Ваш пример и подставлял вместо Notepad++ (и Notepad из примера многоуважаемого YMP) имя своего приложения - не работает. При этом Ваш пример с тем же Notepad++ работает, т.е. все правильно.
Я не удивляюсь, что не работает - в приложении используется безумный движок.
Думаю возможно нужно отлавливать ID окна, а не имя?

Еще раз спасибо за помощь.

28

Re: AHK: Перехват русской раскладки клавиатуры и введение в ASCII 1251

Это разные параметры:

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