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

Application.Exitで終了にできない

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

また、教えてください。

Windowsのアプリケーションで、二重起動なら終了させようと
Application.Exit()を使ったのですが、期待した結果になりま
せん。Application.Exit()でプログラムを終了していないよう
なのです。

確認のため、メインフォームで以下のように書いてみました。
するとApplication.Exit()の次の行に書いたMessageBoxが表
示されてしまいます。(さらにこの後FormのLoadも行なわれ
ています)。

public XXMain()
{
InitializeComponent();
Application.Exit();
MessageBox.Show("Who are you?");
}

なぜ、Application.Exit()ではだめなのでしょうか。どうし
たらうまく終了できるでしょうか。
■No20237に返信(とんびさんの記事)
> なぜ、Application.Exit()ではだめなのでしょうか。どうし
> たらうまく終了できるでしょうか。

MessageBox.Show メソッドをコメントアウトするとうまくいきませんか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36127&forum=7&start=7

ちなみに、Application.Exit メソッドも System.Environment.Exit メソッドも使うべきでないと思います。
私は使ったことがありません。

> Windowsのアプリケーションで、二重起動なら終了させようと

ならば Form にこれらの記述があることはおかしいですよね。
http://blogs.wankuma.com/jeanne/archive/2006/02/12/21205.aspx

普通はエントリ ポイントに実装します。
そもそも VB2005 であればコードを書く必要がありません。
ノンコーディングで二重起動防止を実装することができます。
2007/08/16(Thu) 11:51:24 編集(投稿者)

じゃんぬねっとさん ありがとうございます。

私は、どぼんさんの、この記述を参考にしてApplication.Exit()
をつかったのですが、
http://dobon.net/vb/dotnet/process/checkprevinstance.html

> ちなみに、Application.Exit メソッドも System.Environment.Exit メソッドも使うべきでないと思います。
> 私は使ったことがありません。
>
>>Windowsのアプリケーションで、二重起動なら終了させようと
>
> ならば Form にこれらの記述があることはおかしいですよね。
> http://blogs.wankuma.com/jeanne/archive/2006/02/12/21205.aspx

なんだか、とても難しい問題にぶつかっているみたいですね。

●●●申し訳ありません、明日から旅行に出かけなければならない
ので、この問題を理解するだけの時間的余裕がありません。いった
ん、このスレッドをクローズします。
旅行から戻って、少し勉強してから再度質問させていただきます。
2007/08/10(Fri) 04:35:16 編集(投稿者)

■No20249に返信(とんびさんの記事)
> 私は、どぼんさんの、この記述を参考にしてApplication.Exit()
> をつかったのですが、
> http://dobon.net/vb/dotnet/process/checkprevinstance.html

これは、Loadイベントハンドラなどで判断する例であり、エントリポイントではReturnに置き換えてください。(これは、コード内のコメントにも書いてあります。)

なぜこのようにしているのかといいますと、コード内のコメントにも書かれているように、ここにアプリケーションを終了させるコードを書くという意味で、「Application.Exit」と書いているという理由と、エントリポイントで判断する例をVB.NETで説明するのは非常に厄介であるという理由があります。

この記事が分かりにくいようであれば、近いうちに何らかの書き換えを検討します。

> ●●●申し訳ありません、明日から旅行に出かけなければならない
> ので、この問題を理解するだけの時間的余裕がありません。いった
> ん、このスレッドをクローズします。
> 旅行から戻って、少し勉強してから再度質問させていただきます。

解決済みは、解決した時に付けてください。解決済みにクローズの意味はありませんし、投稿者の都合で勝手に解決済みにされては、他の閲覧者は困ってしまいます。
プロパティページにある
「単一インスタンスのアプリケーションを作成する」
にチェックを入れれば良いのでは?
2007/08/16(Thu) 11:57:06 編集(投稿者)
2007/08/16(Thu) 11:56:34 編集(投稿者)
とんびです。旅行から戻ってきました。

■No20253に返信(管理人さんの記事)
> 2007/08/10(Fri) 04:35:16 編集(投稿者)
>
> ■No20249に返信(とんびさんの記事)
>>私は、どぼんさんの、この記述を参考にしてApplication.Exit()
>>をつかったのですが、
>>http://dobon.net/vb/dotnet/process/checkprevinstance.html

ごめんなさい、こんな風に書いたらうまくいかないのはどぼんさんのせい
みたいですね。こんな状態で、「解決」なんてされたら迷惑なことは分か
ります。すみませんでした。

●本当の解決
上記の記事をもう一度読み直して、Program.cs の static void Main()
の先頭で、二重起動と判定したらreturn するよう書き換えました。
これでうまくいっているようです。

ありがとうございました。
解決済み!
> ごめんなさい、こんな風に書いたらうまくいかないのはどぼんさんのせい
> みたいですね。こんな状態で、「解決」なんてされたら迷惑なことは分か
> ります。すみませんでした。

いえいえ。確かに私の書き方も分かりにくかったと思います。近いうちに、もっと分かりやすいように書き直させていただきます。
解決済み!
tobiuoさんこんにちは。とんびです。

■No20257に返信(tobiuoさんの記事)
> プロパティページにある
> 「単一インスタンスのアプリケーションを作成する」
> にチェックを入れれば良いのでは?

C#のヘルプでは見つからないので、検索の対象にVBのヘルプも含めたら
「単一インスタンスのアプリケーションを作成する」という指定ができ
るのは、VBだけということが分かりました。

でも勉強になりました。ありがとうございます。
解決済み!

>>プロパティページにある
>>「単一インスタンスのアプリケーションを作成する」
>>にチェックを入れれば良いのでは?
>
> C#のヘルプでは見つからないので、検索の対象にVBのヘルプも含めたら
> 「単一インスタンスのアプリケーションを作成する」という指定ができ
> るのは、VBだけということが分かりました。

実は、これも

http://dobon.net/vb/dotnet/process/checkprevinstance.html

に書いてあります。
解決済み!

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