C# でウインドウプロシージャをフックする
C# の場合、コントロールのウインドウプロシージャの動作を外部から変更出来ないし、イベントを追加することも出来ない。
だから、ウインドウプロシージャの動作を変更しようと思うと、そのコントロールを継承し、WndProc や PreProcessMessage を変更する必要がある。
で、今回の場合は、IME を操作したときにウインドウメッセージが投げられるので、それを特定のコントロールに依存しない形でキャッチしたい。
WndProc の動作を変更したいけど特定のコントロールに依存したくない、ということになると、UserControl を継承して WndProc の値を書き換えて内部の本物のコントロールに処理を委譲して……とか考えていた。
でもそれって使う側が結構大変だろうし、実装するのも面倒だ。
なんとかフックしてやれないかなぁといろいろ検索してたら、見つけた。
しかも MSDN から
http://msdn2.microsoft.com/ja-JP/library/ms229658.aspx
これを使ってテキストボックスに渡される WM_KEYDOWN メッセージをフックしてみましたが、無事取得出来ましたヽ(´ー`)ノ
てか SetWindowLong でウインドウプロシージャへのポインタを書き換えるなんて……うますぎるorz