我会说法语和英语,而且我经常从一个键盘(加拿大法语键盘)切换到另一个键盘(美国英语键盘)。当我写法语电子邮件时,法语键盘对于重音符号来说是必不可少的(例如 é、è、à、ç 等。),使用 Vim/编写代码时使用美国布局更加实用。
问题是,我经常在开始打字时,意识到自己使用了错误的键盘布局,然后就必须删除并重新输入我刚才输入的内容。对于 Vim 来说尤其如此,我只需按几下键就可以快速销毁文档。
有没有办法让当前键盘布局比右下角的小指示器更明显?Windows 中是否有现有的设置或我可以安装的软件可以提供帮助?
使用特定键盘布局时的含义示例:
- 彩色屏幕边框
- 永久覆盖(模态、弹出)
- 更改任务栏颜色
- ETC。
我们也欢迎其他有助于减少因使用错误的键盘布局而浪费时间的建议。
答案1
这是迄今为止对我有用的替代方法;使用 AutoHotkey,我可以动态地切换到特定软件的首选语言(例如 Vim 使用 en-CA,而 Slack 使用 fr-CA)。
这不是我的具体问题的答案,但如果它对我有用,那么它也可能对其他人有用:
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
以下是我针对该问题提出的简单 AHK 解决方案。它被硬编码为 EN 和 RU 布局代码(RU - 1049(十六进制:419)和 EN - 1033(十六进制:409))。
算法很简单:如果活动窗口是 RU 布局,则顶部会出现一个红色方块。如果是 EN 布局,则红色方块会消失。这样,我总是能看到布局是否不是 EN,这样我就可以避免输入错误。
该脚本每 600 毫秒扫描一次活动窗口(查看sleep
循环内的参数进行调整),因此它可以在整个系统范围内工作,并且如果单独的应用程序设置了不同的布局,它也可以正确显示。在 Windows 7 和 10 上测试。
要调整大小和位置,请参阅以下行Gui, Show, W100 H100 x980 y500
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
; SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; get Layout of active window
getactiveKL() {
active_hwnd := WinExist("A")
threadID := dllCall("GetWindowThreadProcessId", "uint", active_hwnd, "uint", 0)
code := dllCall("GetKeyboardLayout", "uint", threadID, "uint") & 0xFFFF
return code
}
; 1049 - RU (hex: 419)
; 1033 - EN (hex: 409)
OSD_bg = AA0000
Gui, +AlwaysOnTop +Disabled -SysMenu -Caption +Owner
; Gui, Add, Text, , HELLO
Gui, Color, %OSD_bg%
KL := getactiveKL() ; scan KL once
Gui, Show, W100 H100 x980 y500, NoActivate
; if US then hide
if (KL = 1033) {
Gui, Cancel
}
loop {
KL_prev := KL
sleep, 600
KL := getactiveKL()
if (KL = KL_prev) {
continue
}
if (KL = 1049) {
Gui, Show, NoActivate
}
if (KL = 1033) {
Gui, Cancel
}
}
+esc::exitapp ;press Shift-Escape to close script