C# でウインドウプロシージャをフックする

C# の場合、コントロールのウインドウプロシージャの動作を外部から変更出来ないし、イベントを追加することも出来ない。
だから、ウインドウプロシージャの動作を変更しようと思うと、そのコントロールを継承し、WndProc や PreProcessMessage を変更する必要がある。


で、今回の場合は、IME を操作したときにウインドウメッセージが投げられるので、それを特定のコントロールに依存しない形でキャッチしたい。
WndProc の動作を変更したいけど特定のコントロールに依存したくない、ということになると、UserControl を継承して WndProc の値を書き換えて内部の本物のコントロールに処理を委譲して……とか考えていた。


でもそれって使う側が結構大変だろうし、実装するのも面倒だ。
なんとかフックしてやれないかなぁといろいろ検索してたら、見つけた
しかも MSDN から

http://msdn2.microsoft.com/ja-JP/library/ms229658.aspx

これを使ってテキストボックスに渡される WM_KEYDOWN メッセージをフックしてみましたが、無事取得出来ましたヽ(´ー`)ノ


てか SetWindowLong でウインドウプロシージャへのポインタを書き換えるなんて……うますぎるorz