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

FormClosingイベントでUserClosingをキャンセル後にTaskManagerClosingで閉じられない

環境/言語:[環境(Windows XP, Windows 7)、使用言語(C#)、.NET Frameworkのバージョン(3.5)]
分類:[.NET]

以下のようなアプリを作成しています。
・×ボタンやAlt+F4では終了できない。
・タスクマネージャからは終了できる
・1画面のアプリ

FormClosingイベントで以下のような実装を行い、×ボタンなどのCloseをキャンセルしてます。
if (e.CloseReason == CloseReason.UserClosing)
e.Cancel = true;

タスクマネージャからのアプリケーション終了も単独ではうまく行くのですが、
×ボタンなどで、上記の処理が行われた後にタスクマネージャから終了すると
「このプログラムは対応しておりません。」というメッセージが表示されてしまいます。

現象としては、以下のかんじ
単独でタスクマネージャから終了すると
・CloseReason.TaskManagerClosingでFormClosingイベントが発生する。
・正常にアプリケーションが終了
FormClosingイベントをキャンセルした後にタスクマネージャから終了すると
・CloseReason.UserClosingでFormClosingイベントが2回発生する。
・「このプログラムは応答しておりません。」というメッセージが表示される。

原因に心当たりある方がおりましたら、情報お願い致します。
Form クラスの実装がそういう風になっていたと思います。(不具合だと思いますが)

WM_CLOSE が来たときに、内部で保持している CloseReason が None の時に TaskManagerClosing を代入します。
しかし、SC_CLOSE(閉じるボタン)を押下したとき、CloseReason を UserClosing に設定し、キャンセルされても覚えているので、以降、TaskManagerClosing の理由で通知されることはありません。

個人的には CS_NOCLOSE を使う方法をおすすめしておきます。
http://dobon.net/vb/dotnet/form/disabledclosebutton.html
Azuleanさん

返信ありがとうございます。

■No31556に返信(Azuleanさんの記事)
> Form クラスの実装がそういう風になっていたと思います。(不具合だと思いますが)
やっぱり、そうなんですしょうか。
なんとかしてほしいものです。


> 個人的には CS_NOCLOSE を使う方法をおすすめしておきます。
> http://dobon.net/vb/dotnet/form/disabledclosebutton.html
ありがとうございます。
こちらも検討してみます。
■No31573に返信(minoさんの記事)
> やっぱり、そうなんですしょうか。
> なんとかしてほしいものです。

残念ながら、基本的にこの手のものは変わりません。
大多数が困るわけでも、直らないと回避不可能な致命的な不具合でもないことと、結構昔からある不具合なので今更直すことは考えづらいためです。

また、Windows 8 でタスクマネージャが一新されますが、TaskManagerClosing が送られるような終了方法は、ぱっと見た感じなくなっていそうなので、ニーズとしても低いかもしれません。

そもそも、Windows の設計上、「タスクマネージャから閉じられる」を明確に区別することはできないはずなので、TaskManagerClosing という列挙値を作ったことが過ちだったとも言えるかもしれません。

よって、それに頼らない設計・実装を、我々の立場としては取り組んでいくしかないと思っています。

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