不同应用程序的默认键盘布局不同

不同应用程序的默认键盘布局不同

我知道在 Windows 10 中可以仅为活动应用程序切换键盘语言布局,但我的问题是如何将这些选择设为默认选择。

我的意思是,当我打开 Cygwin 终端时,我总是得到匈牙利键盘布局,必须手动切换到英语。是否可以将英语布局设为 Cygwin 的默认布局(或任何其他应用程序的任何其他布局)?

提前致谢!

问候,Zsolt

答案1

这是使用 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
    }
}

答案2

使用自动热键您可以定期检查活动窗口并根据活动窗口切换键盘布局。

让我引用类似的解决方案,当 Total Commander 的 QuickSearch 窗口变为活动状态时,将键盘布局切换为英语。我想,如果您了解 cygwin 之类的工具,您应该能够轻松地根据自己的需要调整这个。

可读性提示:在下面的脚本列表中,分号开始注释直到行尾。

http://www.script-coding.com/AutoHotkey/AhkRussianEng.html

首先,我们创建一个启动窗口自动化的计时器,并将其插入到脚本的自动执行部分的某个位置。

#Persistent ;脚本将持久保存
;(如果在自动执行部分之后有任何热键或热字符串,
;此指令是不必要的)
SetTimer, Auto_Window, 200 ;每0.2秒移动到指定子程序
返回 ;完成自动执行部分

现在windows本身的自动化子程序:

自动窗口:
;一个标签来调用窗口自动化计时器(此子程序可以放在
;在脚本的任何地方。我喜欢将子程序放在脚本的末尾,但这不是强制性的)

; 如果 QuickSearch 窗口处于活动状态,则切换键盘布局
IfWinActive, ahk_class TQUICKSEARCH ;如果 TC 中的快速搜索窗口处于活动状态,那么...
{
    如果 Win_QS = ;如果窗口刚刚变为活动状态,那么......
    {
        SendMessage, 0x50,, 0x4090409,, ahk_class TQUICKSEARCH
        ; 在快速搜索窗口中将布局切换为英文
        Win_QS = 1 ;标志窗口已经处于活动状态
    }
}
否则;如果窗口不处于活动状态,则......
    Win_QS = ;标记窗口不活动

返回;定时器调用的子程序结束

參閱IfWinActive 的文档了解如何识别您选择的窗口。

相关内容