C#でIMEの入力を受けるユーザーコントロールの作成


時々作りたくなるのですが、毎回忘れて調べるのに苦労する、C# で IME の入力を受けるコントロールの作り方メモです。

一部余分なコードや余分なインポートがありますが、ご勘弁を。以下のことをしておけば最低限動くようです。

  • WndProc をオーバーライド
    • WM_IME_SETCONTEXT メッセージで
      • ImmCreateContext を呼んでコンテキストを作り、ImmAssociateContextEx でハンドルと結びつける
    • WM_IME_STARTCOMPOSITION メッセージで
      • ImmSetCompositionWindow を使い候補ウィンドウの位置を設定する
    • 解放のタイミング(Dispose?)で
      • ImmReleaseContext を呼んで解放

入力文字は、KeyPress イベントで一文字ずつ入ってきます。