1

Тема: AHK: Смена раскладки по-умолчанию

Написал следующий код.
1 Ставлю язык ввода по-умолчанию русский через панель управления.
2 Запускаю скрипт, нажимаю ДА
3 В реестре значения меняются на нужные (англ. раскладка становится по-умолчанию)
4 В панели управления тоже стоит английская по-умолчанию при этом
Скрипт всё равно ругается на отсутствие хоткея Z в системе
Захожу в панель управления, еще раз проверяю, что стоит именно английский по-умолчанию. И только после того как нажму ОК в панели управления (языки и регион. стандарты), скрипт запускается нормально.
Т.е. программно смены данных в реестре в ветке HKCU, Keyboard Layout\Preload не достаточно. Еще должно быть какое-то условие, чтобы раскладка клавиатуры полностью стала по-умолчаню.
Надеюсь не заморочил. Как полностью в ahk сменить раскладку клавиатуры по-умолчанию?

RegRead, Locale, HKCU, Keyboard Layout\Preload, 1
If locale != 409
{
    msgbox,20,, Раскладка клавиатуры по-умолчанию должна стоять Английская.`n`nСменить?`nДа = сменить`nНет = выйти
    IfMsgBox, Yes
    {
        RegRead, Locale2, HKCU, Keyboard Layout\Preload, 2
        RegWrite,REG_SZ, HKCU, Keyboard Layout\Preload, 1, % locale2
        RegWrite,REG_SZ, HKCU, Keyboard Layout\Preload, 2, % locale
        Reload
    }
    else
        ExitApp
}

hotkey, #Z, SendZ, On
return

SendZ:
MsgBox Всё ОК
return

2

Re: AHK: Смена раскладки по-умолчанию

Думаю, нужно ещё информировать систему об изменении с помощью SystemParametersInfo(). Нужный параметр — SPI_SETDEFAULTINPUTLANG.

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

3

Re: AHK: Смена раскладки по-умолчанию

Функция возвращает ноль.
Где копать?

RegRead, Locale, HKCU, Keyboard Layout\Preload, 1
If locale != 409
{
    msgbox,20,, Раскладка клавиатуры по-умолчанию должна стоять Английская.`n`nСменить?`nДа = сменить`nНет = выйти
    IfMsgBox, Yes
    {
        RegRead, Locale2, HKCU, Keyboard Layout\Preload, 2
        RegWrite,REG_SZ, HKCU, Keyboard Layout\Preload, 1, % locale2
        RegWrite,REG_SZ, HKCU, Keyboard Layout\Preload, 2, % locale
        MsgBox % DllCall("SystemParametersInfo", "Uint", SPI_SETDEFAULTINPUTLANG:=0x005A , "Uint", 00000409, "Uint", 0, "Uint", SPIF_SENDCHANGE:=2)
        Reload
    }
    else
        ExitApp
}

hotkey, #Z, SendZ, On
return

SendZ:
MsgBox Всё ОК
return

4

Re: AHK: Смена раскладки по-умолчанию

MsgBox % DllCall("SystemParametersInfo", "Uint", SPI_SETDEFAULTINPUTLANG:=0x005A , "Uint",0, "Uint*",langid:=0x409, "Uint", SPIF_SENDCHANGE:=2)
DllCall("SystemParametersInfo", "Uint", SPI_GETDEFAULTINPUTLANG:=0x0059 , "Uint",0, "Uint*",rlangid, "Uint", 0) . " " . rlangid
SetFormat, IntegerFast, hex
rlangid:=rlangid>>16
rlangid.=""
SetFormat, IntegerFast, d
MsgBox % rlangid

5

Re: AHK: Смена раскладки по-умолчанию

Финальную версию — всенепременно необходимо добавить в коллекцию.
Скрипт будет актуален пока в ahk присутствуют буквенные метки хоткеев.

6

Re: AHK: Смена раскладки по-умолчанию

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

 . " " . rlangid
DllCall("SystemParametersInfo", "Uint", SPI_GETDEFAULTINPUTLANG:=0x0059 , "Uint",0, "Uint*",rlangid, "Uint", 0) . " " . rlangid
SetFormat, IntegerFast, hex
rlangid:=rlangid>>16
rlangid.=""
if  (rlangid!="0x409")
{
   MsgBox,4,, Раскладка по-умолчанию не английскиая. Сменить?
   IfMsgBox, yes
   {
      DllCall("SystemParametersInfo", "Uint", SPI_SETDEFAULTINPUTLANG:=0x005A , "Uint",0, "Uint*",langid:=0x409, "Uint", SPIF_SENDCHANGE:=2)
      Reload
      return
   }
   else
      ExitApp
}
SetFormat, IntegerFast, d

hotkey, #z, Label, on
return
Label:
MsgBox
return

7

Re: AHK: Смена раскладки по-умолчанию

InFlames пишет:

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

 . " " . rlangid

Это не нужно, я проверял в каком порядке происходит вызов функции и возможно ли вывести её результат(находящийся в переменной) в одной строке с её вызовом
Ещё наверное необходимо подметить что Language Identifier возвращаемый функцией состоит из двух значений, см. подробней здесь