misc.log

日常茶飯事とお仕事と

フォーム内のテキストボックスに対するペースト処理を事前にキャッチする

共通ライブラリとして作成した部品類の単体テスト結果をログとして残すために、ペースト処理などの状況もログにだすべく、IMessageFilterを使ったメッセージの事前取得を試みました。

ところが……テキストボックスを貼り付けたフォームに対してIMessageFilterを実装した自作フィルタークラスを用意して

Applicatoin.AddMessageFilter(myMessageFilter)

とやって、フィルター内ではペーストを表すメッセージ番号&H302を選択処理するように記述したのですが、一向に処理に到達しません。メッセージ番号による分岐の手前までは各種メッセージが飛んでくるのですが、ペーストだけとれない。何故?と思って検索していたら、MSDNのフォーラムにこんな一言が……。

MSDN Forum / how to disable the paste in textbox
http://social.msdn.microsoft.com/Forums/eu/winforms/thread/4d0455b4-52b8-426a-a830-5dca9f3911cb

どうやらPreFilterMessageによるフォーム全体でのメッセージ横取りは、TextBoxに対するものは有効でないようで……

unfortunately this (WM_PASTE) doesn't work for TextBox.
but you can handle the TextBox.TextChanged Event
below is an example.

なにがアンフォーチュネートリーだよ……なんだよそれ。

テキストボックス自体を継承したりしてWndProcによって処理すればペーストもとれるのは判っているのですが、できれば「できあがったものの外から」操作をモニターして記録する仕組みを作りたかったので、それはちょっと使えません。ほかの方法ないのかなぁ。

関連情報

IMessageFilterでとれるメッセージは限定的らしい…。

IMessageFilterでWM_HSCROLL、WM_VSCROLLを処理したい
http://social.msdn.microsoft.com/Forums/ja/csharpgeneralja/thread/967de95b-352a-42be-bc4e-c185fb7ecaeb