OS Xキーボードレイアウトスイッチャー

私はかなり長い間OS Xを使用しており、その便利な言語切り替えシステムに慣れています。 Windowsでの切り替えとの違いは、Macでは、最後の2つの言語間で言語が切り替えられることです。 Windowsに2つの言語がある限り、これで問題は発生しませんが、私は個人的には4つの言語を標準としている人を知っています。 。 そのため、次の第3言語のアンインストール/インストールの後、シンプルなキーボードレイアウトスイッチを自分で作成し、同時に有用な経験を得ることが決定されました。

プログラムのソースはhttps://bitbucket.org/Ezbar/languageswitcher/overviewで入手できます 。 コンパイルせずにプログラムを試してみたい人のために、ダウンロードセクションでバイナリを見つけます。

どのタスクを解決する必要がありましたか:

-キーストロークの組み合わせのインターセプトWin + Space
-アクティブなプログラムのレイアウト変更
-レイアウトを変更した後、アクティブなプログラムのフォーカスが失われる

各ケースを個別に検討します。 キーストロークをインターセプトするには、API関数を使用して、WH_KEYBOARD_LLのフックを設定します。 定数の値とフック呼び出しのバインディング全体をコードで表示できます。

言語を切り替えるコンビネーションプレステスト機能
static IntPtr IgnoreWin_Space(int nCode, IntPtr wParam, IntPtr lParam) { Boolean spacePressed = false; var keyInfo = (KbHookParam)Marshal.PtrToStructure(lParam, typeof(KbHookParam)); if (nCode == HC_ACTION) { if ((int)wParam == WM_KEYDOWN) { if (keyInfo.VkCode == (int)Keys.Space) { spacePressed = true; kSpace = true; } else kSpace = false; //     if (GetAsyncKeyState(Keys.LWin) < 0) kWin = true; else { kWin = false; } if (kWin && kSpace) { if (spacePressed) { Bar.SetLanguage(""); Bar.Show(); //  ,    return (IntPtr)1; //just ignore the key press } } } } if ((int)wParam == WM_KEYUP) { if (keyInfo.VkCode == (int)Keys.LWin) { kWin = false; Bar.DoHide(); string HEX = Bar.getHex(); uint WM_INPUTLANGCHANGEREQUEST = 0x0050; uint KLF_ACTIVATE = 1; PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(HEX, KLF_ACTIVATE)); } } return CallNextHookEx(HookHandle, nCode, wParam, lParam); } 


アクティブなプログラムのレイアウト変更も、PostMessage関数によるAPI呼び出しを介して行われます。 これを行うには、アクティブなアプリケーションの記述子を取得し、レイアウトを変更するメッセージを彼に送信します。 システムにインストールされているすべての言語とその切り替え順序を取得する機能から、言語をエンコードするための16進コードを取得します。

アクティブなプログラムのレイアウトを変更する
 string HEX = Bar.getHex(); uint WM_INPUTLANGCHANGEREQUEST = 0x0050; uint KLF_ACTIVATE = 1; PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(HEX, KLF_ACTIVATE)); 


たとえば、ブラウザのアドレスバーにテキストを入力すると、アクティブなプログラムのフォーカスが失われることがあります。 言語を切り替えた後、入力が行われたテキストフィールドのフォーカスが消えました。 これは、コンストラクターで非常に簡単に修正できることが判明しました。

コンストラクターのコード
 // Show a Form without stealing focus protected override bool ShowWithoutActivation { get { return true; } } 


その結果、3つ以上のキーボードレイアウトがインストールされている場合、良い経験と、生活を楽にする小さくて便利なプログラムが得られました。 コメントやアドバイスに感謝し、スペルミスや考えの混chaとした表現について謝罪します。 著者は独学であり、おそらく、適切な名前で何かを呼ぶことはありません。 ご清聴ありがとうございました。 この出版物が、たとえば同じコンピューター上にOSX + Windowsを持っている人や、プログラミングを学んでいる人に役立つことを願っています。

Source: https://habr.com/ru/post/J308468/


All Articles