- PR -

プロセスを切るには

投稿者投稿内容
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 する | 殺す | 終了させる | 終わらせる | 落とす }」というのは聞いたことがあるけど、「切る」ははじめて聞いた。タイトルだけ読んで、「分離するのか?」と思った。
最後に、お礼なら受け取るが、捨て台詞はいらないよ。
_________________

スキルアップ/キャリアアップ(JOB@IT)