DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Closingイベントの原因特定方法

環境/言語:[.NET Framework 2.0]
分類:[.NET]

いつも参考にさせて頂いております。

タイトルの件、Closingイベントの原因が閉じるボタンなのか、
コードのClose()メソッドなのかを判別したいと考えております。
そこで、.NET Tipsの「フォームが閉じられる時その原因を知る」に
「(ウィンドウの「閉じる」ボタンのクリックにより閉じられようとしているのか、
コードのCloseメソッドにより閉じられようとしているのか等)知る」と記載されていたので、まさにこれだ!!と思い実行してみたのですが、
CloseReasonは共にUserClosingとなり判別できませんでした。

これを実現するには「WndProcメソッドをオーバーライドする方法」
しかないのでしょうか?

その他スマートな方法などありましたら、
恐縮ですが教えていただけると助かります。
2.0ならFormClosingイベントではだめですか?

というより、インターネットでサンプルを探す前にMSDNを見ましょうよ。
公式ドキュメントですから。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form.closing(VS.80).aspx
■No24023に返信(雲さんの記事)
> タイトルの件、Closingイベントの原因が閉じるボタンなのか、
> コードのClose()メソッドなのかを判別したいと考えております。

2.0 以降では、Closing ではなく FormClosing を使うことが推奨されています。

もっとも、CloseReason を調べているという事は、既に FormClosing を
利用されているという事なのでしょうけれども。


> これを実現するには「WndProcメソッドをオーバーライドする方法」
> しかないのでしょうか?

同ページには、他に StackTrace を使う方法も紹介されていたかと思います。

WndProc 法とどちらがスマートかの判断はお任せしますが、StackTrace を使うなら、
呼び出し履歴から、"SendMessage" メソッドを呼ばれたかどうかを追跡するとか、
あるいは Form.Close メソッドの呼び出し有無を調べるといった手が使えるでしょう。
単純に、Closeメソッドを呼び出すときにフラグを立てるという方法はどうなんでしょうか?もし、Closeメソッドを呼び出したけれど別の理由でフォームが閉じられる可能性があるならばダメかもしれませんが...。
■No24038に返信(管理人さんの記事)
> 単純に、Closeメソッドを呼び出すときにフラグを立てるという方法はどうなんでしょうか?もし、Closeメソッドを呼び出したけれど別の理由でフォームが閉じられる可能性があるならばダメかもしれませんが...。

>まどか様
FormClosingイベントを使用しておりました。
誤ってClosingイベントと記載してしまい、申し訳ありませんでした。

>魔界の仮面弁士様
StackTraceの方法についても検討してみました。
こちらでも判断可能で目的が達成できそうです!
WndProc 法とどちらが良いか検討してみます!

>管理人様
なるほど。そういう手を忘れておりました!
参考にさせて頂きたいと思います。

皆様アドバイスありがとうございました!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板