1 (изменено: 4talk, 2015-09-06 20:25:17)

Тема: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Приветствую!

Подскажите, пожалуйста, как с помощью AutoHotkey решить следующую задачу: в Punto Switcher есть замечательный функционал, который позволяет назначить активацию английской раскладки на правую клавишу Shift, а активацию русской — на правую клавишу Ctrl. Этот функционал можно воспроизвести с помощью AutoHotkey?

Правда есть такие нюансы:

  • я использую типографскую раскладку Бирмана, для работы которой из системы нужно убрать стандартную русскую и английскую раскладки и заменить их специальными, которые добавляет в систему эта самая типографская раскладка;

  • переключение должно работать во всех программах, AutoHotkey это поддерживает?

Буду очень благодарен, если поможете реализовать такой функционал, потому что с помощью AutoIt мне не удалось этого добиться.

Использую Windows 10, x64 (может это важно).

2

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Что выдаёт это скрипт?

Count:=DllCall("GetKeyboardLayoutList", UInt, 0, UInt, 0)
VarSetCapacity(Buf, Count*4)
DllCall("GetKeyboardLayoutList", UInt, Count, UInt, &Buf)
List:=""
SetFormat, Integer, H
Loop, % Count
    List.=NumGet(Buf, (A_Index-1)*4) . "`n"
MsgBox, % List
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3 (изменено: teadrinker, 2015-09-07 01:28:34)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

У меня три раскладки, а твой скрипт выдаёт:

0x4190419
0x409040900000000

Правильно как-то так:

NumberOfLayouts := DllCall("GetKeyboardLayoutList", Int, 0, Ptr, 0)
VarSetCapacity(buff, A_PtrSize * NumberOfLayouts)
DllCall("GetKeyboardLayoutList", Int, NumberOfLayouts, Ptr, &buff)
SetFormat, IntegerFast, H
Loop % NumberOfLayouts
   Layouts .= NumGet(&buff + A_PtrSize*(A_Index - 1), "UInt") . "`n"
MsgBox, % Layouts
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: serzh82saratov, 2015-09-06 23:56:46)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

а твой скрипт выдаёт

Не виноватый я, он отсюда пришёл.

На х32 должен работать.

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

5

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

4talk пишет:

Использую Windows 10, x64 (может это важно).

Откуда ты знаешь, что нужно для х32?

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

6 (изменено: serzh82saratov, 2015-09-06 23:59:52)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Я про AutoHotkey 32-bit. На AutoHotkey 64-bit не проверил.
На Win7x64 и AutoHotkey 32-bit работает.

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

7

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Так если Windows x64, где гарантия, что AHK x32? Да и хороший код должен работать для любой версии.

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

8

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Так я и не спорю, говорю же - не проверил.

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

9

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

А уж вот это:

UInt, &Buf

ну просто стыдно!

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

10

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Подправил немного.

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

11

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov пишет:

Что выдаёт это скрипт?

Count:=DllCall("GetKeyboardLayoutList", UInt, 0, UInt, 0)
VarSetCapacity(Buf, Count*4)
DllCall("GetKeyboardLayoutList", UInt, Count, UInt, &Buf)
List:=""
SetFormat, Integer, H
Loop, % Count
    List.=NumGet(Buf, (A_Index-1)*4) . "`n"
MsgBox, % List

Извините за задержку с ответом. Скрипт выдаёт:

0xF0C00409
0xF0C10419

12

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

В теории так должно:

~RShift::OnLocale(0xF0C00409)
~RCtrl::OnLocale(0xF0C10419)
 
OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Если так работает, то можно сделать скрипт переключающий циклично раскладки, не вникая в ID и количество раскладок, или включающий их по порядковому номеру.


Global Layouts := {}
NumberOfLayouts := DllCall("GetKeyboardLayoutList", Int, 0, Ptr, 0)
VarSetCapacity(buff, A_PtrSize * NumberOfLayouts)
DllCall("GetKeyboardLayoutList", Int, NumberOfLayouts, Ptr, &buff) 
Loop % NumberOfLayouts 
    Layouts[Layouts["L" A_Index] := NumGet(&buff + A_PtrSize*(A_Index - 1), "UInt")] := (Layouts.MI := A_Index) 

~RAlt::ToggleLocale()

~RShift::OnLocale(Layouts["L" 1])
~RCtrl::OnLocale(Layouts["L" 2])
 
OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A") 
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
    ; ToolTip % Layouts[InputLocaleID]  ; раскомментировать, чтобы узнать порядковый номер раскладки
}

ToggleLocale()  {
    InputLocaleID := DllCall("GetKeyboardLayout", "Int"
    , DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0"))
    OnLocale(Layouts["L" (Layouts[InputLocaleID] + 1 > Layouts.MI ? 1 : Layouts[InputLocaleID] + 1)])
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Или так:

~RShift::
~RCtrl::
   ControlGetFocus, CtrlFocus, A
   PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, A_ThisHotkey = "~RCtrl" ? 0x419 : 0x409, % CtrlFocus, A
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Не мог нагуглить, как реализовать автосмену раскладки на английский язык для перечисленных программ. И то же самое, но на русский.
Например, чтобы при переходе в активный режим окна какого-нибудь мессенджера язык автоматически переключался на русский, а при активации того же NotePad++ на английский соответственно.
Ткните носом, если уже есть, пожалуйста!

16

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Ищите "мониторинг смены активного окна", у нас было.

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

17

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker а в системе может быть одновременно например 0xF0C00409 и 0x4090409?

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

18

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Да, у меня одновременно русские 0x4190419 и 0xF0C00419.

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

19

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

И как кодом из 14 переключает?

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

20

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Тот код для случая, когда только две раскладки. Когда русских две, видимо берёт первую попавшуюся, у меня 0xF0C00419.

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

21 (изменено: 4talk, 2015-09-08 14:56:56)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov пишет:

В теории так должно:

~RShift::OnLocale(0xF0C00409)
~RCtrl::OnLocale(0xF0C10419)
 
OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
}

Большое спасибо за вашу помощь! Всё сразу же заработало с помощью этого скрипта. А как правильно автоматически запускать этот скрипт от имени администратора при каждом запуске ПК?

Есть смысл использовать эти версии скриптов, если всё работает на основе вашего первого скрипта?

22

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov, кстати, выполнив этот скрипт, по нажатию на правый Shift включается русская раскладка, а по нажатию на правый Ctrl — английская. Нужно наоборот :-)

23 (изменено: becauseim, 2015-09-08 08:54:11)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker пишет:

Ищите "мониторинг смены активного окна", у нас было.

Таки не нашел, к сожалению.

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

24 (изменено: serzh82saratov, 2015-09-08 11:53:31)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

4talk

Нужно наоборот :-)

Значит надо поменять местами.

~RShift::OnLocale(0xF0C10419)
~RCtrl::OnLocale(0xF0C00409)
 
OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
}

Оформите ссылки в соответствии с правилами форума.

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

25 (изменено: 4talk, 2015-09-08 19:01:17)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov, вы меня неправильно поняли. Ваш первый скрипт, из этого сообщения, заработал у меня сразу же, мой вопрос был адресован второму скрипту (ссылка). Именно в этом втором скрипте перепутаны раскладки.

Осталась одна мелкая задача, прошу подсказать: как правильно запускать этот скрипт при запуске ПК от имени администратора?

UPD: сегодня обновил Skype до версии 7.10.0.101 и обнаружил, что если в нём я пытаюсь переключать раскладку клавиатуры с помощью скрипта, то Skype намертво зависает, приходится выгружать через Диспетчер задач. Подобные конфликты можно как-то решить?

26

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim пишет:

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

А какого вида будет перечень? Приведите пример.

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

27

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

4talk пишет:

пытаюсь переключать раскладку клавиатуры с помощью скрипта, то Skype намертво зависает

Было такое же по вине ПунтоСвитчера, если он у Вас установлен, попробуйте его обновить, в моем случае проблема решилась именно так.

28

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker пишет:

А какого вида будет перечень?

Думаю, любого. Главное, чтобы можно было самостоятельно добавить нужные программы для каждого из языков. На данном этапе мне необходимо, чтобы раскладка автоматически менялась на английскую, например, в окнах таких процессов, как atom.exe, vegas130.exe, TotalCmd64.exe.

29

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Ясно, попозже напишу.

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

30

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim пишет:
4talk пишет:

пытаюсь переключать раскладку клавиатуры с помощью скрипта, то Skype намертво зависает

Было такое же по вине ПунтоСвитчера, если он у Вас установлен, попробуйте его обновить, в моем случае проблема решилась именно так.

Дело в том, что после установки Windows 10 я его вообще не устанавливал Punto Switcher. То есть, сейчас Skype v7.10.0.101 зависает именно в тот момент, когда я переключаю раскладку клавиатуры с помощью скрипта от разработчика serzh82saratov.

31 (изменено: serzh82saratov, 2015-09-08 20:24:42)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim


#Persistent
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc") 
Return

ShellProc(nCode, wParam)    {
    Static HSHELL_WINDOWACTIVATED := 4    
        , ru := "|NotePad++.exe|"
        , eng := "|atom.exe|vegas130.exe|TotalCmd64.exe|"
    
    If (nCode = HSHELL_WINDOWACTIVATED)
    { 
        WinGet, Process, ProcessName, A 
        InStr(ru, "|" Process "|") ? OnLocale(0x0419) : InStr(eng, "|" Process "|") ? OnLocale(0x0409) : 0 
    }  
}

OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

4talk
Со Skype у меня проблем нет.

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

Тоже поменять местами.


~RShift::OnLocale(Layouts["L" 2])
~RCtrl::OnLocale(Layouts["L" 1])
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov, спасибо! Но, кажется, не работает. Ничего не меняется.

34

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

А так?


#Persistent
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc") 
Return

ShellProc(nCode, wParam)    {
    Static HSHELL_WINDOWACTIVATED := 4    
        , ru := "|NotePad++.exe|"
        , eng := "|atom.exe|vegas130.exe|TotalCmd64.exe|"
    
    If (nCode = HSHELL_WINDOWACTIVATED)
    { 
        WinGet, Process, ProcessName, A
        InStr(ru, "|" Process "|") ? OnLocale(0x4190419) : InStr(eng, "|" Process "|") ? OnLocale(0x4090409) : 0 
    }  
}

OnLocale(InputLocaleID)  {
    ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
    PostMessage, 0x50, 0, InputLocaleID, %CtrlFocus%
}

В NotePad++ русский не включает?

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

35

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov, попробовал и так, ничего. У Вас работает? На всякий случай, отмечу, что у меня WIN10x64.

36

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

У меня работает.
Уже на этой странице 2 проблемы, и 2 WIN10.

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

37

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov, подскажите, пожалуйста, как в вашем скрипте указать, что хоткеи не должны срабатывать в Skype? Так как у меня с другими программами проблем не возникает, не хочется постоянно вешать Skype из-за использования скрипта, лучше пусть он будет в исключениях прописан.

38

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim, ещё так можно попробовать:

list := [ {process: "atom.exe"      , lang: "en"}
        , {process: "vegas130.exe"  , lang: "en"}
        , {process: "TotalCmd64.exe", lang: "en"} ]

DllCall("RegisterShellHookWindow", Ptr, A_ScriptHwnd) 
OnMessage(DllCall("RegisterWindowMessage", Str, "SHELLHOOK"), Func("ShellProc").Bind(list)) 
OnExit, Exit
Return

ShellProc(list, nCode)
{ 
   static HSHELL_WINDOWACTIVATED := 4, WM_INPUTLANGCHANGEREQUEST := 0x50
   if (nCode != HSHELL_WINDOWACTIVATED)
      Return
   
   WinGet, Process, ProcessName, A
   for k, v in list  {
      if (Process = v.process)  {
         ControlGetFocus, CtrlFocus, A
         PostMessage, WM_INPUTLANGCHANGEREQUEST,, v.lang = "ru" ? 0x419 : 0x409, % CtrlFocus, A
      }
   }
} 

Exit:
   DllCall("DeregisterShellHookWindow", Ptr, A_ScriptHwnd)
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Так понял, скрипт не рассчитан для Win10?

40

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Уже даже неловко, но ни один из предложенных вариантов у меня не сработал.
Вот эти горячие клавиши у меня отлично срабатывают:

^!+1:: SendMessage, 0x50, , 0x4090409, , A ; Switch Language to English
^!+2:: SendMessage, 0x50, , 0x4190419, , A ; Switch Language to Russian

Можно интерпретировать их действия на активность перечисленных окон?
Пробую что-то вроде:

#IfWinActive, ahk_exe vegas130.exe
SendMessage, 0x50, , 0x4090409, , A
return

но не получается.

41 (изменено: teadrinker, 2015-09-09 02:45:19)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Наверное, RegisterShellHookWindow() в десятке не работает.

Ещё так:

#Persistent
list := [ {process: "atom.exe"      , lang: "en"}
        , {process: "vegas130.exe"  , lang: "en"}
        , {process: "TotalCmd64.exe", lang: "en"} ]
        
EVENT_OBJECT_FOCUS := 0x8005
SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0, RegisterCallback("HookProc", "F", 4, ptr := Object(list)), 0, 0, 0)
ObjRelease(ptr)

HookProc(hWinEventHook, event, hwnd, idObject)
{
   static OBJID_CLIENT := 0xFFFFFFFC, PrevID, WM_INPUTLANGCHANGEREQUEST := 0x50
   if (idObject != OBJID_CLIENT)
      Return
   
   WinGet, ID, ID, A
   if (ID = PrevID)
      Return
   PrevID := ID
   
   for k, v in Object(A_EventInfo)  {
      if WinActive("ahk_exe " v.process)  {
         ControlGetFocus, CtrlFocus
         PostMessage, WM_INPUTLANGCHANGEREQUEST,, v.lang = "en" ? 0x409 : 0x419, % CtrlFocus
      }
   }
}


SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

42

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker, работает! Также добавил параметр для русской раскладки в Скайпе:

{process: "Skype.exe", lang: "ru"}

Самостоятельно сумел набрать только так:

Loop {
    IfWinActive, ahk_exe skype.exe
    SendMessage, 0x50, , 0x4190419, , A 
    }

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

43

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim пишет:

Самостоятельно сумел набрать только так

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

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

44 (изменено: teadrinker, 2015-09-09 02:41:35)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Хотя, можно так:

list := [ {process: "skype.exe"  , lang: "en"}
        , {process: "notepad.exe", lang: "ru"} ]

Loop  {
   Sleep, 100
   WinGet, ID, ID, A
   if (ID = PrevID)
      continue
   PrevID := ID
   
   for k, v in list  {
      if WinActive("ahk_exe " v.process)  {
         ControlGetFocus, CtrlFocus
         PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, v.lang = "en" ? 0x409 : 0x419, % CtrlFocus
      }
   }
}

Но это несколько более затратный способ.

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

45

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Упростил немного оба скрипта.

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

46

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

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

#IfWinactive, ahk_exe Program.exe

Сейчас Ваш сценарий работает только тогда, когда я размещаю его вначале своего файла, но все остальные скрипты работать перестают. Если же добавляю его в конец, то работают все остальные сценарии, кроме Вашего.
Как мне обособить Ваш сценарий в категорию, не попадающую под действие в определенной программе, а являясь, скорее, системным скриптом, или даже установить игнорирование на остальные положения в скрипте, чтобы в одном файле работали все сценарии?

47

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Помогите, пожалуйста, топикстартеру добить по этим двум сообщения: первое, второе.

48

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

becauseim пишет:

чтобы в одном файле работали все сценарии

#Persistent
list := [ {process: "skype.exe"  , lang: "ru"}
        , {process: "notepad.exe", lang: "en"} ]

ChangeLayout := Func("ChangeLayout").Bind(list)
SetTimer, % ChangeLayout, 100
Return

ChangeLayout(list)
{
   static WM_INPUTLANGCHANGEREQUEST := 0x50, PrevID
   
   WinGet, ID, ID, A
   if (ID = PrevID)
      Return
   PrevID := ID
   
   for k, v in list  {
      if WinActive("ahk_exe " v.process)  {
         ControlGetFocus, CtrlFocus
         PostMessage, WM_INPUTLANGCHANGEREQUEST,, v.lang = "en" ? 0x409 : 0x419, % CtrlFocus
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

49

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker, попробовал поставить последний вариант в начале, а потом в конце файла. Ситуация не изменилась. Можно что-то еще попробовать?

50

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Уберите из кода Return и поставьте в начале.

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

51 (изменено: serzh82saratov, 2015-09-09 22:55:01)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

А почему отошли от метода из 41 поста, он же лучше цикла или таймера?

Предлагаю реагировать только на родительские окна, и не перебирать весь массив (там даже если есть совпадение, цикл продолжается).


#Persistent
list := {"Skype.exe":"ru", "notepad++.exe":"en"}

SetWinEventHook(EVENT_SYSTEM_FOREGROUND := 0x0003, EVENT_SYSTEM_FOREGROUND, 0, RegisterCallback("HookProc", "F", 3, ptr := Object(list)), 0, 0, 0)
ObjRelease(ptr)

HookProc(hWinEventHook, event, hwnd)  {  
    If DllCall("GetParent", Ptr, hwnd)
        Return
    WinGet, Process, ProcessName, ahk_id %hwnd%
    If (Object(A_EventInfo).haskey(Process))  { 
        ControlGetFocus, CtrlFocus, ahk_id %hwnd%
        PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, {"en":0x409,"ru":0x419}[Object(A_EventInfo)[Process]], %CtrlFocus%, ahk_id %hwnd%
    } 
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
   Return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
}
+ Немного попроще, если непринципиально глобален массив, или супер-глобален.

#Persistent
Global list := {"Skype.exe":"ru", "notepad++.exe":"en"}

SetWinEventHook(EVENT_SYSTEM_FOREGROUND := 0x0003, EVENT_SYSTEM_FOREGROUND, 0, RegisterCallback("HookProc", "F"), 0, 0, 0) 

HookProc(hWinEventHook, event, hwnd)  {
    If DllCall("GetParent", Ptr, hwnd)
        Return
    WinGet, Process, ProcessName, ahk_id %hwnd%
    If (list.haskey(Process))  { 
        ControlGetFocus, CtrlFocus, ahk_id %hwnd%
        PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50, , {"en":0x409,"ru":0x419}[list[Process]], %CtrlFocus%, ahk_id %hwnd%
    } 
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
   Return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

52

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

EVENT_SYSTEM_FOREGROUND лучше подходит, а

    If DllCall("GetParent", Ptr, hwnd)
        Return

вроде лишнее.

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

53 (изменено: serzh82saratov, 2015-09-09 23:07:42)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Так, а дочерние окна зачем? В них язык как и в главном.

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

54

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

А почему оно на дочерние должно срабатывать, если это EVENT_SYSTEM_FOREGROUND?

#Persistent

EVENT_SYSTEM_FOREGROUND := 0x0003
SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0, RegisterCallback("HookProc", "F"), 0, 0, 0)

HookProc(hWinEventHook, event, hwnd)  {
    SoundBeep
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
   Return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
}

Сработает один раз на каждую смену активного окна.

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

55

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Не знаю, реагирует же например на активацию диалога "найти" в блокноте.

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

56

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

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

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

57

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Несколько логичней уже после нахождения процесса в списке проверять, не дочернее ли это окно.

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

58

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Значит можно на таком варианте остановится:

#Persistent
Global list := {"Skype.exe":"ru", "notepad++.exe":"en"}

SetWinEventHook(EVENT_SYSTEM_FOREGROUND := 0x0003, EVENT_SYSTEM_FOREGROUND, 0, RegisterCallback("HookProc", "F"), 0, 0, 0) 

HookProc(hWinEventHook, event, hwnd)  { 
    WinGet, Process, ProcessName, ahk_id %hwnd%
    If (list.haskey(Process))  { 
        ControlGetFocus, CtrlFocus, ahk_id %hwnd%
        PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50, , {"en":0x409,"ru":0x419}[list[Process]], %CtrlFocus%, ahk_id %hwnd%
    } 
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
   Return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
            , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
} 

Единственно изначально не ясно зачем проверять активации окон, а не просто их создание. То есть при создании нужного окна просто включать для него язык не поумолчанию. Мало ли во время работы понадобится русский язык, а оно при каждой активации на английский переводить будет.

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

59 (изменено: teadrinker, 2015-09-09 23:42:29)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov пишет:

Значит можно на таком варианте остановится

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

зачем проверять активации окон, а не просто их создание.

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

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

60

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

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

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

61

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Сначала не всё прочитал, отредактировал. Про переключение раскладки — запускаешь последний скрипт, активируешь notepad++, переключаешь в нём раскладку на русскую, затем вызываешь какое-либо дочернее окно — раскладка снова переключится на английскую.

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

62 (изменено: serzh82saratov, 2015-09-09 23:50:54)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

переключаешь в нём раскладку на русскую, затем вызываешь какое-либо дочернее окно — раскладка снова переключится на английскую.

Я про то и говорил что дочерние проверять не лишнее.

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

Я у себя давно так использую.

ап:

В том варианте — при переходе с дочернего на родительское.

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

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

63

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

serzh82saratov пишет:

Так и не понял.

Запускаешь этот скрипт, активируешь notepad++, переключаешь раскладку на русскую, вызываешь дочернее окно, закрываешь его — раскладка переключится на английскую.

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

64 (изменено: serzh82saratov, 2015-09-09 23:54:27)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Отредактировал пост выше.

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

65

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Я у себя давно так использую.

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

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

66 (изменено: becauseim, 2015-09-10 01:13:34)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

teadrinker пишет:

Уберите из кода Return и поставьте в начале.

Убрал строку. Что именно и в начало чего ставить не понял, попробовал сценарий ставить, как и ранее, сперва в начало файла, потом в конец. Вариант из 58 поста также конфликтует в одном файле с другими скриптами. Но если ставлю его в начало скрипта, то последущая горячая клавиша для другой программы работает только частично. Отрывок из моего файла:


SetTitleMatchMode 2
DetectHiddenWindows On
SetKeyDelay -1

ToggleInputMethods:

#Persistent
Global list := {"Skype.exe":"ru", "atom.exe":"en"}

SetWinEventHook(EVENT_SYSTEM_FOREGROUND := 0x0003, EVENT_SYSTEM_FOREGROUND, 0, RegisterCallback("HookProc", "F"), 0, 0, 0)

HookProc(hWinEventHook, event, hwnd)  {
        WinGet, Process, ProcessName, ahk_id %hwnd%
        If (list.haskey(Process))  {
                ControlGetFocus, CtrlFocus, ahk_id %hwnd%
                PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50, , {"en":0x409,"ru":0x419}[list[Process]], %CtrlFocus%, ahk_id %hwnd%
        }
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
     Return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
                        , Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
}

NewProgram:

#IfWinactive, ahk_exe vegas130.exe

Counts:
Count_F2 := 0

    ~F2:: ; Pause/Select Event/Select Loop
         F2:= ["{F2}", "+{F2}", "+^{[}{vk52}"], Period_F2 := 0250 ; Здесь третья переменная перестает срабатывать, при размещенном выше скрипте на автопереключение
         SendInput % F2[Count_F2 := Count_F2*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period_F2))+1]
    Return

67

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

В общем, нужно весь ваш файл смотреть. Но здесь вряд ли кому интересно. У меня в личке — только платно, от 500 р.

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

68

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

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

69

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Ответьте, пожалуйста, кто-нибудь на сообщение.

70

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Дайте пожалуйста простой AutoHotKey скрипт для эмуляции комбинации Alt+Shift для переключения между двумя языками : RU и EN. Мне необходимо назначить эту комбинацию на одну из дополнительных клавишь клавиатуры.

71 (изменено: timotv, 2020-01-22 19:19:17)

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Почему в результате выполнения следующих скрипт язык не переключается?

SendInput, {Alt}
SendInput, {Shift}
Exit 
SendInput, {Alt shift}
Exit 

72

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

Почему не делает? Что написано, то и делает — нажимает Alt, потом Shift (не удерживая Alt).

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

73

Re: AHK: Переключение раскладки клавиатуры с помощью клавиш Ctrl и Shift

О, кажется подобрал:

SendInput, {Alt down}{shift}
Send {Alt up}
Exit