web-dev-qa-db-ja.com

Windowsのドイツ語とロシア語のキーボードレイアウト間の元に戻す(Ctrl-Z)およびやり直し(Ctrl-Y)ショートカットの物理的な場所を修正

私は、キーボードレイアウトの混乱の別の犠牲者を模倣しています。これは、類似しているがわずかに異なる問題に苦しんでいます。

私はWindows10ワークステーションでドイツ語とロシア語のキーボードレイアウトを広範囲に使用しており、それらを頻繁に切り替えています。この問題は、ドイツ語のキーボードレイアウトでは、標準の英語QWERTYレイアウトと比較して、文字YとZが入れ替わっているという事実に関連しています。

ドイツ語のレイアウトを使用する場合、元に戻すショートカット(Ctrl-Z)は、TとUの間の最初の文字行の中央にあるキーZにバインドされます。やり直し(Ctrl-Y)はキーYにバインドされます。 、ドイツ語のQWERTZレイアウトの文字の低い行のXの左側にあります。

レイアウトをロシア語に切り替えると、突然邪悪なことが起こります。元に戻すショートカットとやり直しショートカットは、キーボード上の位置を相互に変更します。元に戻す(Ctrl-Z)はY(下の行、左からX)にあり、やり直しはZ(上の行、TとUの間)にあります。これは、標準の英語キーボードレイアウトのCtrl-ZおよびCtrl-Yの場所と同じ場所です。

つまり、キーボードレイアウトを切り替えるたびに、[元に戻す]ショートカットと[やり直し]ショートカットの場所が逆になります。あなたが想像できるように、私はいつも間違った近道を押しています。なぜなら、少なくとも私の脊椎の脳の抗議である、2つの振動する反対のパターンを学ぶことは不可能だからです。元に戻すショートカットとやり直しショートカットを頻繁に使用するため、この動作は私を非常に苛立たせます。

Windowsアプリケーションのセット全体のやり直しおよび元に戻すショートカットの物理的な場所(キー)をドイツ語またはより良い英語のレイアウトに修正したいと思います。

元に戻す/やり直しのショートカットをジャンプする問題は修正されますが、すべての種類のラテン語ベースのテキストに英語のレイアウトを永続的に使用しますが、すべてのウムラウトとßを含むドイツ語のテキストを入力する必要があるため、オプションではありません(ドイツ語が私の第一言語であり、1回のキーストロークで母国語を入力したいので、アクセントを入力します。

すでに述べた参照された質問の同僚として、インターネットには明白な答えはありません。同じ問題は、カスタムキーボードレイアウトを作成することでUbuntuでも解決されます。 Windows用のカスタムレイアウトの作成または現在のレイアウトへのパッチ適用に関する情報が見つかりません。

この動作は、私が知っているすべてのバージョンのWindowsで一貫しており、初期のキーボードレイアウト設計に深く関係しています。これは、ユーザーがたまたま私のようなドイツ語とロシア語のペアを使用する場合には互換性がありません。

優れたソリューションは、追加のソフトウェアを使用せずに、または無料のオープンソースソフトウェアのみを使用してWindowsに直接実装する必要があります。 AutoHotKeyを含む実用的なソリューションは大歓迎です。

@miroxlavの助けを借りて、私はこの半分機能するAHKスクリプトを思いつきました。

; Undo
$^z::
    hWnd := WinExist("A")
    ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
    hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
    If (hKL = 0x4070409)   ; revert undo-redo hotkey mapping if in German layout
        Send ^y
    Else
        Send ^н            ; pass the keystroke through
Return

; Redo
$^y::
    hWnd := WinExist("A")
    ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
    hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
    If (hKL = 0x4070409)   ; revert undo-redo hotkey mapping if in German layout
        Send ^z
    Else
        Send ^я            ; pass the keystroke through
Return

このスクリプトは、ドイツ語レイアウトではCtrl-Y <-> Ctrl-Zを完全に再マップしますが、ロシア語レイアウトでは両方のホットキーを破損します。ロシア語のレイアウトに相当するCtrl-YまたはCtrl-Zスキャンコードをエミュレートするために^нと^яを使用しますが、機能しません(Ctrl-Yの場合はнを生成し、Ctrl-Zの場合は何も表示されません)。ロシア語に^ zと^ yを使用しても機能せず、それぞれ文字zとyが生成されます。

Miroxlavの回答とは異なり、ループを回避してラベルを削除するためにキーボードフック($)を使用する必要がありました(おそらくコピーアンドペーストの間違い)

ウィリアムズによって提案された解決策:

^SC02c::Send ^y
^SC015::Send ^z

残念ながら、どちらも機能しません。ロシア語のレイアウトではプレーン文字「y」と「z」が生成され、ドイツ語のレイアウトでは変更されません(元のマッピングで渡されたCtrl-ZとCtrl-Y)。

まだ解決策を探しています。

2
Anton Golubev

私はついに私のために働く解決策を見つけました(AutoHotKeyスクリプト):

; Undo Ctrl-Z
^sc02C::
    Send, ^{sc015}
Return

; Redo Ctrl-Y
^sc015::
    Send, ^{sc02C}
Return

キーボードのレイアウトとは関係なく、論理的な場所(左下の行)に元に戻すキー(Ctrl-Z)を完全に保持します。

@Miroxlavと@Williamsに、ソリューションのピースを持ってきてくれてありがとう。

0
Anton Golubev

公式MicrosoftダウンロードセンターのMicrosoft Keyboard Layout Creator 1.4 を使用して、独自のキーボードレイアウトを作成するだけです。

Youtubeには、その使用方法に関するビデオチュートリアルがたくさん用意されています(ロシア語のロケールでは this など)-名前を検索するだけです。ただし、基本的には、既存のキーボードレイアウトのいずれかを複製し、必要に応じて変更します。

AutoHotKeyソリューション:

(注:0x4090409定数(USキーボード)をレイアウトに適用される値に置き換えてください)

$^z::
    hWnd := WinExist("A")
    ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
    hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
    If (hKL = 0x4090409)
        Send ^z
    Else
        Send ^y
Return

$^y::
    hWnd := WinExist("A")
    ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
    hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
    If (hKL = 0x4090409)
        Send ^y
    Else
        Send ^z
Return

再帰を回避するには、フック($)が必要です。つまり、Send ^zまたはSend ^yは、別のAHKマクロのみを呼び出します。

私はそのキーボードの検出条件をテストしました、それはうまくいきました。

もちろん、キーボード検出を機能に配置して、コードなどを最適化することもできます。私はそれをするのが面倒でした。 :)

1
miroxlav