C# で IME 操作をフックする

C# でウインドウプロシージャをフックする(id:melpon:20060616)でウインドウプロシージャをフック出来るようになったんですが、ウインドウプロシージャをフックしてもどうにもならない場合があります。
IME 操作中にウインドウプロシージャに送られてきた WM_KEYDOWN メッセージは、通常は仮想キーの値が入っているはずの wParam に VK_PROCESS が入っていて、押された仮想キーの値が分かりません。
こいつから元の仮想キーを取り出すためには、ImmGetVirtualKey() を使えばいいんですが、ウインドウプロシージャの処理をする時点で取得しようとしても、取得出来ません
恐らく、IME が自身の操作を終わらせてしまっているので、手遅れなんだと思われます。
なので、IME が操作をする前の段階か、PreProcessMessage() 辺りでこの処理を行う必要があります。
PreProcessMessage() はコントロールに依存するので、出来れば使用したくありません。


いろいろ調べてみると、出てきました。
Application.AddMessageFilter() です。こいつは、IME が操作をする前の段階で呼ばれます。
しかも返り値に true を渡すと、ウインドウメッセージは処理されず、IME に操作を与えません


これを使って起動中の IME に操作を与えずに自前の処理を追加したり、ImmGetVirtualKey() で元のキーの値を取得出来たりします。
まあ、true を返すのは元のコントロールに影響を与えるのであまり良くないです。なので、出来る限り最小限になるようにフックしましょう。