Различные раскладки клавиатуры по умолчанию для разных приложений
Я знаю, что в Windows 10 можно переключаться между раскладками языка клавиатуры только для активного приложения, но мой вопрос заключается в том, как сделать этот выбор по умолчанию.
Я имею в виду, что когда я открываю, например, терминал Cygwin, я всегда получаю венгерскую раскладку клавиатуры и вынужден вручную переключаться на английский. Можно ли сделать английский макет по умолчанию для Cygwin (или любой другой макет для любого другого приложения, в целом)?
Заранее спасибо!
С уважением, Жолт
2 ответа
Это еще один способ решения проблемы с помощью AutoHotKey, который автоматически назначит клавиатуру по умолчанию для всех приложений, кроме определенных (например, Cygwin).
Этот скрипт не будет зацикливаться; он получит уведомление при переключении в другое окно.
https://gist.github.com/christianrondeau/00d7cd5848f33e029f00ce2b6b935ab9
; How to use:
; 1. Install AuthotKey: https://www.autohotkey.com
; 2. Save this script in `My Documents`
; 3. Create a shortcut in the Startup folder (`Win`+`R`, `shell:startup`)
; 4. Change the configurations below
; 5. Start and test the script!
; Configuration
; Cultures can be fetched from here: https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx
; They must be set twice in the language ID;
; en-US: 0x04090409
; fr-CA: 0x0C0C0C0C
global DefaultLanguage := "fr-CA"
global DefaultLanguageIndentifier := "0x0C0C0C0C"
global SecondaryLanguage := "en-US"
global SecondaryLanguageIndentifier := "0x04090409"
global SecondaryLanguageWindowTitles := "VIM,Visual Studio"
; And the code itself (you should not have to change this)
Gui +LastFound
hWnd := WinExist()
DllCall( "RegisterShellHookWindow", UInt,Hwnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return
ShellMessage( wParam,lParam )
{
WinGetTitle, title, ahk_id %lParam%
; 4 is HSHELL_WINDOWACTIVATED, 32772 is HSHELL_RUDEAPPACTIVATED
If (wParam=4 || wParam=32772) {
If title contains %SecondaryLanguageWindowTitles%
SetKeyboard( title, SecondaryLanguage )
Else
SetKeyboard( title, DefaultLanguage )
}
}
SetKeyboard( title, culture )
{
; 0x50 is WM_INPUTLANGCHANGEREQUEST.
Try
{
If (culture = SecondaryLanguage)
{
PostMessage, 0x50, 0, %SecondaryLanguageIndentifier%,, A
; To debug:
; ToolTip, Using secondary language %SecondaryLanguage%
; Sleep 1000
; ToolTip
}
Else If (culture = DefaultLanguage)
{
PostMessage, 0x50, 0, %DefaultLanguageIndentifier%,, A
; To debug:
; ToolTip, Using default language %DefaultLanguage%
; Sleep 1000
; ToolTip
}
Else
{
; To debug:
; ToolTip, Unknown culture: %culture%
; Sleep 1000
; ToolTip
}
}
Catch e
{
ToolTip, Could not switch to %culture%`n%e%
Sleep 1000
ToolTip
}
}
Используя AutoHotKey, вы можете периодически проверять наличие активного окна и переключать раскладку клавиатуры в зависимости от того, какое окно стало активным.
Позвольте мне процитировать аналогичное решение, которое переключает раскладку клавиатуры на английский, когда окно быстрого поиска Total Commander становится активным. Я предполагаю, что если вы понимаете такие инструменты, как Cygwin, вы легко сможете настроить его для своих нужд.
Подсказка по удобочитаемости: в приведенных ниже списках сценариев точка с запятой начинает комментарий до конца строки.
http://www.script-coding.com/AutoHotkey/AhkRussianEng.html
Сначала мы создаем таймер, который запустит автоматизацию окон, и вставим его куда-нибудь в секцию автоматического выполнения скрипта.
# Постоянный; Сценарий будет постоянным;(если у вас есть горячие клавиши или горячие строки после секции автоматического выполнения,; эта директива не нужна) SetTimer, Auto_Window, 200; Переход к указанной подпрограмме каждые 0,2 секунды Вернуть; Завершить автозапускную часть
Теперь подпрограмма автоматизации окон:
Auto_Window:; метка для вызова таймера автоматизации окна (эта подпрограмма может быть размещена в любом месте сценария. Мне нравится ставить подпрограммы в конце скрипта, но это не обязательно) ; переключить раскладку клавиатуры, если окно быстрого поиска активно IfWinActive, ahk_class TQUICKSEARCH; если окно быстрого поиска в ТС активно, то... { если Win_QS =; если окно только что стало активным, то... { SendMessage, 0x50,, 0x4090409,, ahk_class TQUICKSEARCH; Переключите раскладку на английский в окне быстрого поиска Win_QS = 1; Отметить, что окно уже активно } } Остальное; если окно не активно, то... Win_QS =; Отметить, что окно НЕ активно Вернуть; Конец подпрограммы, которая вызывается таймером
Обратитесь к документации для IfWinActive, чтобы узнать, как распознавать окна по вашему выбору.