1 (изменено: Malcev, 2012-01-31 00:24:38)

Тема: AHK: При активной раскладке латышского языка программа ведет странно

При активной раскладке латышского языка латышские символы печатаются при зажатом правом ALT, то есть ALT+a = ā
Но программа, в которой я работаю, при активной раскладке латышского языка (только латышского) нажатие правого ALT воспринимает как CTRL+ALT.
А при нажатии CTRL+ALT в этой программе выделяются объекты и соответственно в ней я печатать латышскими символами не могу.
Как выйти из такой ситуации?

2 (изменено: creature.ws, 2012-01-31 03:08:43)

Re: AHK: При активной раскладке латышского языка программа ведет странно

AltGr_key
Диакритические знаки
Наименования горячих клавиш

; для использования в AHK-L актуальной версии, UTF.
<^>!vk41::Send &#257;

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

код исправлен

3 (изменено: Malcev, 2012-01-31 00:43:41)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Я примерно до того же дошёл,

!a::&#257;

но только это  работает при любой раскладке, но не латышской.

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

А как сделать, чтобы это влияло только при латышской раскладке, а не наоборот?
При активной латышской раскладке вообще не удаётся послать диакритические знаки ни вашим ни моим способом.

4 (изменено: creature.ws, 2012-01-31 00:59:10)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Признаюсь, смысл сообщения выше до меня не доходит.
«Это не влияло» — что «это», на что не «влияло», что значит «не влияло»
«А не наоборот» — вгоняет меня в хвостовую рекурсию.

А вы разве пробовали посылать диакритические знаки?
Ваш и мой пример отправляют А с макроном, но не макрон.
Попробуйте добавить $ перед меткой хоткея, либо использовать иную клавишу-модификатор.

:*?:aa::&#257;

Строка автозамены приведенная выше — работает?

5 (изменено: Malcev, 2012-01-31 00:56:31)

Re: AHK: При активной раскладке латышского языка программа ведет странно

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

a::&#257;
<^>vk41::Send &#257;

Знак не отобразится.
При активной же русской раскладке, либо английской всё ОК.
Если при активной латышской раскладке заменить &#257; на, например, &#224; то всё показывается.

6

Re: AHK: При активной раскладке латышского языка программа ведет странно

Строка автозамены приведенная выше — работает?

Нет, просто стирается буква "a".

7

Re: AHK: При активной раскладке латышского языка программа ведет странно

А скопировать-вставить "&#257;" в поле ввода проблемной программы можно?

8 (изменено: Malcev, 2012-01-31 01:34:16)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Да, конечно.
А не подскажете, как задисейблить CTRL+ALT?

^!::return
*^!::return

почему-то не работает

9 (изменено: creature.ws, 2012-01-31 01:32:08)

Re: AHK: При активной раскладке латышского языка программа ведет странно

$!vk41::Send {U+0101}

При использовании такого хоткея отправляется ли &#257; в окно проблемной программы после нажатия LAlt+a?

10

Re: AHK: При активной раскладке латышского языка программа ведет странно

Да, заработало!!!!!!
Спасибо!
А как привязать активацию этого скрипта только при активации латышского языка?

11 (изменено: creature.ws, 2012-01-31 03:08:30)

Re: AHK: При активной раскладке латышского языка программа ведет странно

$<^>!vk41::Send {U+0101}

А такая горячая клавиша работает?

А как привязать активацию этого скрипта только при активации латышского языка?

Используя #If и функцию, проверяющую раскладку активного окна (есть в коллекции)

код исправлен

12 (изменено: Malcev, 2012-01-31 01:49:19)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Да

13 (изменено: creature.ws, 2012-01-31 02:24:07)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Например:


#If (InputLayout() = "Russian")
    :*?:.::,
    :*?:,::.
#If

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
  , HKL      := DllCall("GetKeyboardLayout", "uint", ThreadID)
  , VarSetCapacity(sKbd, 260, 0)
  , DllCall("GetLocaleInfo", "uint", HKL>>16
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return %sKbd%
}

Перестановка запятой и точки срабатывает только если скрипт может определить, что активное окно «переключено на ввод русского», адаптируйте&#8210;используйте.

14 (изменено: Malcev, 2012-01-31 03:08:46)

Re: AHK: При активной раскладке латышского языка программа ведет странно

У вас в скрипте была опечатка,

AltGr = <^>!

а не

AltGr = <^>

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

<^>!+a::Send {U+0100}
<^>!a::Send {U+0101}
<^>!+e::Send {U+0112}
<^>!e::Send {U+0113}
<^>!+i::Send {U+012A}
<^>!i::Send {U+012B}
<^>!+u::Send {U+016A}
<^>!u::Send {U+016B}
<^>!+c::Send {U+010C}
<^>!c::Send {U+010D}
<^>!+g::Send {U+0122}
<^>!g::Send {U+0123}
<^>!+k::Send {U+0136}
<^>!k::Send {U+0137}
<^>!+l::Send {U+013B}
<^>!l::Send {U+013C}
<^>!+n::Send {U+0145}
<^>!n::Send {U+0146}
<^>!+s::Send {U+0160}
<^>!s::Send {U+0161}
<^>!+z::Send {U+017D}
<^>!z::Send {U+017E}

Огромное спасибо за помощь!

По поводу скрипта раскладки.
Он у меня никак не хотел определять латышский язык.
Пришлось сделать так

#If (InputLayout() != "Russian") & (InputLayout() != "English")
...

Почему, не подскажете?

15

Re: AHK: При активной раскладке латышского языка программа ведет странно

А какое значение возвращает InputLayout() если активное окно переключено на латышский?

16

Re: AHK: При активной раскладке латышского языка программа ведет странно

А куда вписать?

MsgBox, %InputLayout%

Что-то не получается,

17

Re: AHK: При активной раскладке латышского языка программа ведет странно

Вот так можно:

F11:: MsgBox, % InputLayout()

18

Re: AHK: При активной раскладке латышского языка программа ведет странно

При английском - English
При русском - Russian
При латышском - "пустота".

19 (изменено: YMP, 2012-01-31 06:49:26)

Re: AHK: При активной раскладке латышского языка программа ведет странно

А числовой код раскладки показывает? Например, русский будет 0x4190419, англ. 0x4090409.

F11:: MsgBox, % InputLayout()

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    SetFormat, Integer, Hex
    Return DllCall("GetKeyboardLayout", "uint", ThreadID)
}

20

Re: AHK: При активной раскладке латышского языка программа ведет странно

Русский и английский показывает, тот который вы написали.
А латышский тоже показывает, но какой-то ошибочный - "-0xFEAFBDA"

21

Re: AHK: При активной раскладке латышского языка программа ведет странно

А если так?

F11:: MsgBox, % InputLayout()

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    SetFormat, Integer, Hex
    Return DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
}

22

Re: AHK: При активной раскладке латышского языка программа ведет странно

Опять какая-то ерунда
0xF0150426

23

Re: AHK: При активной раскладке латышского языка программа ведет странно

Ну, почему ерунда? Вот, смотрите:

0x0426 Latvian (lv) 0x26 LANG_LATVIAN Latvia (LV) 0x01 SUBLANG_LATVIAN_LATVIA

Язык указан правильный — 0x0426. А верхняя часть числа (0xF015), по-моему, раскладку должна обозначать. У каждого языка может быть не одна раскладка.

Попробуйте исходный скрипт, возможно, сейчас он что-то выдаст?

F11:: MsgBox, % InputLayout()

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    SetFormat, Integer, Hex
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL>>16
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

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

24

Re: AHK: При активной раскладке латышского языка программа ведет странно

Не, не показывает.
Буду ориентироваться, как вы предложили по числовому коду.
Спасибо!

25 (изменено: YMP, 2012-01-31 08:35:16)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Вероятно, тут ни к чему вот этот сдвиг: HKL>>16. В рус. и англ. он ничего не меняет, т.к. обе части числа одинаковые. Если всё-таки интересно разобраться, попробуйте так:

F11:: MsgBox, % InputLayout()

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    SetFormat, Integer, Hex
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
    ; Либо так:
    ; HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

26

Re: AHK: При активной раскладке латышского языка программа ведет странно

А сейчас он на все языки показывает пустое поле.

27

Re: AHK: При активной раскладке латышского языка программа ведет странно

Закомментированный вариант не пробовали? У меня он работает.

F11:: MsgBox, % InputLayout()
 
InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

А с полным HKL — да, пусто. Я забыл его запустить, видимо.

28

Re: AHK: При активной раскладке латышского языка программа ведет странно

Заработало.
Спасибо.
А  в чём причина была?
Почему с "UShort" пошло, а с "UInt" нет?

29

Re: AHK: При активной раскладке латышского языка программа ведет странно

Видимо, GetLocaleInfo нужен только Language ID, т.е. нижняя половина HKL, младшие 16 бит числа. А "UShort" — это как раз и есть 16-битное число. При указании его как типа возвращаемого значения АНК игнорирует всё, что выше 16 бит.
Можно было вернуть и как "UInt", а потом сделать так:


DllCall("GetLocaleInfo", "uint", HKL & 0xFFFF
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)

Т.е. стереть верхнюю часть перед передачей в функцию.

30 (изменено: Malcev, 2012-02-01 10:35:11)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Почему-то не работает

#If (InputLayout() = "Russian")
   MsgBox, ru
#If (InputLayout() = "English")
   MsgBox, en
InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

31 (изменено: YMP, 2012-02-01 10:55:35)

Re: AHK: При активной раскладке латышского языка программа ведет странно

А так?

If (InputLayout() = "Russian")
   MsgBox, ru
If (InputLayout() = "English")
   MsgBox, en
InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

32

Re: AHK: При активной раскладке латышского языка программа ведет странно

А так заработало!
Спасибо!

33

Re: AHK: При активной раскладке латышского языка программа ведет странно

Прилагаемые ссылки читать в большинстве случаев полезно
#If это директива для задания горячих клавиш работающих при условии истинности выражения указанного после #If

34

Re: AHK: При активной раскладке латышского языка программа ведет странно

Я читал это.
И убирал их #.
Но видно голова уже шла кругом, потому что у меня, что с ними, что без них скрипт не запускался.

35 (изменено: Malcev, 2012-03-05 07:04:42)

Re: AHK: При активной раскладке латышского языка программа ведет странно

Вот код

<^>!+a::Send {U+0100}
<^>!a::Send {U+0101}
<^>!+e::Send {U+0112}
<^>!e::Send {U+0113}
<^>!+i::Send {U+012A}
<^>!i::Send {U+012B}
<^>!+u::Send {U+016A}
<^>!u::Send {U+016B}
<^>!+c::Send {U+010C}
<^>!c::Send {U+010D}
<^>!+g::Send {U+0122}
<^>!g::Send {U+0123}
<^>!+k::Send {U+0136}
<^>!k::Send {U+0137}
<^>!+l::Send {U+013B}
<^>!l::Send {U+013C}
<^>!+n::Send {U+0145}
<^>!n::Send {U+0146}
<^>!+s::Send {U+0160}
<^>!s::Send {U+0161}
<^>!+z::Send {U+017D}
<^>!z::Send {U+017E}

Но Возникла проблема.
Во время работы на удалённом компьютере на клавиатуре AltGr воспринимается, как AltR - и этот код недееспособен.
Надо вписывать не

<^>!a::Send {U+0101}

а

RAlt & a::Send {U+0101}

Но если я вписываю их оба друг за другом, то глючит

<^>!a::Send {U+0101}
RAlt & a::Send {U+0101}

Поэтому 2 вопроса.
1) Как объединить эти ремапы с логическим "или".
То есть

<^>!a || RAlt & a:: Send {U+0101}

2) Как записать

RAlt & Shift & a::Send {U+0100}

Пока вижу только так, но тут большой минус - удалённый компьютер воспринимает зажатую клавишу шифт только на отжатие, т.е. действие выполняется как-будто бы стоит не Shift::, a Shift Up::  т.е. чтобы написать 2 заглавных буквы нужно 2 раза нажать на шифт.
Как бы это исправить?

RAlt & a::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0100}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0101}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0100}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0101}
      return
   }
}

36

Re: AHK: При активной раскладке латышского языка программа ведет странно

В итоге скрипт превратился вот в такую простыню.
Победить неправильное воспринимание зажатых модификаторов так и не удалось.

RAlt & a::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0100}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0101}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0100}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0101}
      return
   }
}


RAlt & e::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0112}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0113}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0112}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0113}
      return
   }
}


RAlt & i::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+012A}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+012B}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+012A}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+012B}
      return
   }
}


RAlt & u::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+016A}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+016B}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+016A}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+016B}
      return
   }
}


RAlt & c::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+010C}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+010D}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+010C}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+010D}
      return
   }
}


RAlt & g::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0122}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0123}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0122}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0123}
      return
   }
}


RAlt & k::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0136}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0137}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0136}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0137}
      return
   }
}


RAlt & l::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+013B}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+013C}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+013B}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+013C}
      return
   }
}


RAlt & n::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0145}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0146}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0145}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0146}
      return
   }
}


RAlt & s::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+0160}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+0161}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+0160}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+0161}
      return
   }
}


RAlt & z::
if not GetKeyState("Capslock", "T")
{
   If GetKeyState("Shift")
   {
      Send {U+017D}
      return
   }
   If Not GetKeyState("Shift")
   {
      Send {U+017E}
      return
   }
}
if GetKeyState("Capslock", "T")
{
   If Not GetKeyState("Shift")
   {
      Send {U+017D}
      return
   }
   If GetKeyState("Shift")
   {
      Send {U+017E}
      return
   }
}
return