DWMを使用する最新バージョンのWindowsでのタスクバーの色とウィンドウタイトルを備えたキーボードレイアウトインジケーター

Windowsのキーボードレイアウトインジケーターは、目立たないものです。 間違ったレイアウトでマシンに入力された文字は常にイライラさせられます。 少なくとも私。 そのため、可能な限り現在のキーボードレイアウトの目立つインジケータが必要でした。 まあ、少なくとも画面上で目を動かす必要がないもの。



理想的なオプションは、入力フィールドのカーソルのすぐ横に小さなインジケータを付けることですが、これは難しいタスクであることが判明しました。一部のアプリケーションはシステムカーソルをまったく使用しません。 この問題に対するシンプルでかなり便利な解決策は、システム全体でタスクバーとウィンドウのタイトルの色を変更することでした。 判明したように、これは、デスクトップウィンドウマネージャーAPIの文書化されていない機能を使用してプログラムで実行できます...



そのため、現在のキーボードレイアウトを最大限に視覚的に確認するために、Windowsテーマの色(タスクバーとウィンドウのタイトルの色)を変更します。 Aeroテーマの色を変更します。つまり、Vistaで始まるバージョンのみがサポートされます。



まず、現在のキーボードレイアウトのモニターを起動します。 彼は、レイアウトの変更を追跡するためにWindows Shell Hook (WH_SHELL)をセットアップします。 正確には、追跡されるのはレイアウトの変更ではなく、入力言語の変更です。 残念ながら、このソリューションは、1つの(たとえば、日本語)言語に対して複数の異なるレイアウトを使用する人々には適していません。 ハンドラーでは、HSHELL_LANGUAGEイベントにのみ応答し、新しく選択された言語に関するメインアプリケーション情報を単純なWindowsメッセージで送信します。



小さな技術的な特徴は、シェルフックハンドラーを実行可能ファイルではなくDLLに配置する必要があることです。 したがって、ハンドラーのインストールは、C ++で書かれた小さなフッカーライブラリーに移動されました。



Windowsの32ビットバージョンと64ビットバージョン、およびUACと「管理者モード」に関する重要なポイントがいくつかあります。



実際、64ビットバージョンのWindowsの32ビットアプリケーションと64ビットアプリケーションの両方で言語変更イベントをインターセプトするには、32ビットハンドラーと64ビットハンドラーを別々にインストールする必要があります。 したがって、Hookerライブラリとその制御HookerWatcherアプリケーションは両方のアーキテクチャ用に構築され、メインアプリケーションは両方のバージョンを起動します。



別の問題は「管理者モード」です。 実際、管理者として実行されているアプリケーションは、昇格された特権のないアプリケーションとは完全に分離されています。 したがって、現在の入力言語の強調表示をこの隔離された環境で機能させるには、管理者モードで、両方のアーキテクチャのシェルフックを再設定する必要があります。 もうこれはしませんでした。必要に応じて、「管理者に代わって」アプリケーション全体の2番目のインスタンスを起動するだけで、すべてが正常に機能します。



Windowsテーマの色を制御するために、Vistaに登場したDesktop Window Manager APIを使用します。 最近のバージョンのWindowsでウィンドウの表示を制御するのは、このライブラリです。





色の設定は、WDM_COLORIZATION_PARAMS構造によって決定されます。DWMのドキュメントには記載されておらず、MSDNフォーラムのドイツ語のセクションにあります。 簡単にするために、アプリケーションの設定で、Windowsテーマの色を自分で変更し、現在の色を1つの主要言語または他のすべての言語に使用することを示すことをお勧めします。 つまり、アプリケーションの設定では、WDM_COLORIZATION_PARAMS構造の2つのインスタンスのみを保存します-「メイン」言語とそれ以外のすべてのユーザー用です。



メインアプリケーションはWindowsフォームを使用し、オーバーロードされたWndProcメソッドを持つ1つのフォームで構成されます。このメソッドでは、現在の言語のモニターから受信したメッセージが処理されます。 言語の変更の通知を受け取った後、アプリケーションはDwmSetColorizationParametersメソッドを使用してWindowsテーマの色を設定します。



ちなみに、Windows 7では、[スタート]メニューのクイック検索で現在の言語のインジケーターのややおかしい動作を観察できました。ロシア語のレイアウトで文字を入力した後、言語が一時的に英語に切り替わりました。 そして、それに応じて、次の文字を入力すると、インジケータが点滅しました。 また、組み込みのレイアウトインジケーターは顕著な遅延で反応し、点滅のような問題は発生しませんでした。 Windows 8では、組み込みのインジケーターは既にすぐに動作します。



ソースコードはGitHubにあり、リリースバージョンはこちらからダウンロードできます



All Articles