- MyHandle
- 常連さん
- 会議室デビュー日: 2007/04/15
- 投稿数: 39
|
投稿日時: 2007-09-06 22:06
引用: |
|
ぶさいくろうさんの書き込み (2007-09-06 20:04) より:
やれやれ。シグネチャに返信がくるとは思わなかったな。
そして引用した内容は無視とはなかなかやるなぁ。
|
軽い口調はご遠慮ください。
|
- ぶさいくろう
- ぬし
- 会議室デビュー日: 2005/11/22
- 投稿数: 1232
- お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
|
投稿日時: 2007-09-07 00:11
引用: |
|
MyHandleさんの書き込み (2007-09-06 22:06) より:
軽い口調はご遠慮ください。
|
はいはいww
|
- れい
- ぬし
- 会議室デビュー日: 2005/11/01
- 投稿数: 346
|
投稿日時: 2007-09-07 03:20
引用: |
|
MyHandleさんの書き込み (2007-09-05 23:47) より:
引用: |
|
渋木宏明(ひどり)さんの書き込み (2007-09-05 19:04) より:
.NET 1.x ならともかく、.NET 2.0 で追加された FormClosing イベントを使えば、もっと穏便な実装が可能です。
|
ここで挙げたソースはFormClosingのイベントの一部です。
何が足りないのでしょうか?
|
引用: |
|
ぶさいくろうさんの書き込み (2007-09-06 00:05) より:
Reasonの活用
|
ひどりさん、ぶさいくろうさんが言っているように、
FormClosingEventArgs.CloseReasonを調べれば、
フォームがなぜ閉じられようとしているのか、理由がある程度わかります。
これを利用し、場合によってはCancel=trueとするのも可能です。
また、NotifyIconで昔からよく使われている手法に、
タスクバーに表示されないFormを使う方法があります。
タスクバーに表示されず、見えないFormを作っておき、
このフォームをコンテナとしてNotifyIconを作成します。
フォームが作られるときにNotifyIcon.Visible=trueとし、
フォームが閉じられるときにNotifyIcon.Disposeします。
このようにしておけば、
.Netのインストーラーはプロセスが存在するか自動で調べ、
プロセスを終了するか、アンインストールをキャンセルするか、
ユーザーにプロンプトしてくれます。
[ メッセージ編集済み 編集者: れい 編集日時 2007-09-07 03:21 ]
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2007-09-08 20:47
引用: |
|
できることはやってそのうえで投稿しています。
|
やって無くても、やったことが見えない相手に対して「やった」と言える罠。
FormClosing イベントは見て、FormClosingEventArgs までは見て、Cancel プロパティは参照したのなら、もう少し見てみればいいのに。少なくとも、本文には反応していないから、やるべきことをやってないよね。
引用: |
|
FormClosingEventArgs.CloseReason プロパティ
フォームが閉じられようとしている理由を示す値を取得します。
CloseReason 列挙体
ApplicationExitCall Application クラスの Exit メソッドが呼び出されました。
FormOwnerClosing 所有側のフォームが閉じられようとしています。
None フォームが閉じられる理由が定義されなかったか、確認できませんでした。
TaskManagerClosing Microsoft Windows タスク マネージャがアプリケーションを終了しようとしています。
UserClosing ユーザーが、フォーム ウィンドウの [閉じる] ボタンを押す、ウィンドウのコントロール メニューの [閉じる] をクリックする、Alt キーと F4 キーを同時に押すなどの方法で、ユーザー インターフェイス (UI) を通じてフォームを閉じようとしています。
WindowsShutDown オペレーティング システムが終了前にすべてのアプリケーションを終了しようとしています。
|
で、ここまで見てたら、「Reason を見るようにしたら、アンインストール時(Windows シャットダウン時、の間違いじゃない?)には終了するようになったけど、終了メニューからも終了できなくなってしまった。」という問題に変わると思うんだよね。
だから、「やるべきことをやってない」と判断します。
そいで、そのことも考慮すると、こんなコードが考えられる、と。
コード: |
|
クラス変数
Dim ForceClose As Boolean = False
終了メニューのイベント
ForceClose = True
Me.Close
Closing イベント
If e.CloseReason = CloseReason.UserClosing AndAlso ForceClose = False Then
Me.Visible = False
Me.Enabled = False
Me.WindowState = FormWindowState.Minimized
e.Cancel = True
End If
|
他にも、Application.Run メソッドに渡すのは Form だけとは限らないので、表示しないメイン ウインドウを作っておき、終了メニューではそっちを Close する、と言う方法もある。
何にしても、Process.GetCurrentProcess().Kill() だと、リソースがリークする可能性があるので、やめるのが吉。
おっともう一つ。「プロセスを { kill する | 殺す | 終了させる | 終わらせる | 落とす }」というのは聞いたことがあるけど、「切る」ははじめて聞いた。タイトルだけ読んで、「分離するのか?」と思った。
最後に、お礼なら受け取るが、捨て台詞はいらないよ。
_________________
|