wndProc メッセージハンドリング
Control.WndProcメソッド
Windowsフォームを用いてGUIを実装する場合に、想定していないオペレーションが実施されて強制終了してしまうケースがある。またそういったオペレーションは手順を覚えていない場合が多く、再現が困難であることがある。log4netなどを用いて、WndProc内でハンドリングしてあげればオペレーションを再現することができる。
protected override void WndProc(ref Message m)
{
log.Debug(System.Windows.Forms.Control.FromHandle(m.LParam) + " // " + m.ToString());
base.WndProc (ref m);
}
ちなみに
すべてのメッセージは、 PreProcessMessage メソッドを通じてフィルタ処理された後に WndProc メソッドに送られます。
となっていたけど私が実験したプログラムではPreProcessMessageメソッドは通過しなかったなぁ。これはやり方の問題かもしれない。
それから上記のコードでは、MenuItemをハンドリングできません。いや厳密にはできているんだけど、MenuItemはSystem.Windows.Forms.Controlの派生ではないので、FormHandleメソッドでハンドルが取れません。なので、MenuItem関係については、それぞれのイベント(OnClickなど)の中でログ出力するように記述してあげるとよいのでしょう。
ユーザテストなどにおいて、Visual StudioなどのIDEでのデバッグ環境が構築できない場合において、有用な手段だと思います。製品版とは異なる位置づけになりますが、検査版の場合に導入するとよいでしょう。