web-dev-qa-db-ja.com

Windows 10で現在のキーボードレイアウトをより明確にする方法は?

私はフランス語と英語の両方を話し、あるキーボード(フランス系カナダ人)から別のキーボード(英語米国)に切り替えることがよくあります。フランス語のメールを書くとき、アクセント(例:é、è、à、çなど)にはフランス語のキーボードが必要になりますが、Vimを使用する/コードを書く方が米国のレイアウトでははるかに実用的です。

問題は、頻繁に入力を開始し、間違ったキーボードレイアウトを使用していることに気づき、削除して、実行していたことを再入力する必要があることです。これは特にVimに当てはまり、数回のキーストロークでドキュメントをすばやく破棄できます。

現在のキーボードレイアウトを小さな右下隅のインジケーターよりもはるかにわかりやすくする方法はありますか? Windowsに既存の設定、またはインストールできるソフトウェアがありますか?

特定のキーボードレイアウトを使用しているときの意味の例:

  • 色付きの画面の境界線
  • 永続的なオーバーレイ(モーダル、ポップアップ)
  • タスクバーの色を変更する
  • 等。

間違ったキーボードレイアウトを使用して失われた時間を減らすのに役立つ他の提案をいただければ幸いです。

3

これは、これまで私にとって有効な代替手段です。 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(16進数:419)およびEN-1033(16進数:409))にハードコードされています。

アルゴリズムは単純です。アクティブウィンドウにRUレイアウトがある場合、赤い四角が上部に表示されます。 ENレイアウトの場合は消えます。このようにして、レイアウトがENでないかどうかを常に確認するので、入力ミスを回避できます。

スクリプトは600ミリ秒ごとにアクティブウィンドウをスキャンするため(ループ内のsleepパラメーターを参照して調整します)、システム全体で機能し、個別のアプリのレイアウトが異なる場合は正しく表示されます。 Windows7および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
1
Mikhail V