質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

4348閲覧

【C#】System.Diagnostics.Process.Start()で起動させたアプリケーションのApplication.ApplicationExitイベントが動作しない

aridai1221

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/07/26 06:01

###前提・実現したいこと
System.Diagnostics.Process.Start()で起動したアプリケーションを
System.Diagnostics.Process.CloseMainWindow()で終了させて
Application.ApplicationExitイベントを発生させたいです。

###発生している問題・エラーメッセージ
Application.ApplicationExitに登録したイベントハンドラが実行されませんでした。

###試したこと
イベントハンドラの設定し忘れ、
System.Diagnostics.Process.CloseMainWindow()の呼び忘れ、
タスクマネージャのプロセス
などを確認してみましたが、
特に問題となるようなものは見つけることができませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
関係ないかもしれませんが、
起動させられたアプリケーションは
Windowsフォームアプリケーションで
起動させたアプリケーションはUnityです。
Unity側のAwake()で起動させて
Unity側のOnApplicationQuit()で終了させるようにしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

流れを見ると、メインフォームを閉じた後に form.Foo() が呼ばれる想定のようですが、メインフォームを閉じたらフォームのインスタンスは無くなる可能性があるので、フォームのメソッドは触ってはいけません。
Foo() をフォームのメソッドでなくするか、ApplicationExit ではなく form.Closing で呼ぶようにするかしてみてください。

投稿2016/07/26 09:41

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aridai1221

2016/07/26 09:57

回答ありがとうございます。 実際はformをメンバに持たせてあるのですが、 簡単に書くためにローカル変数のように書きました。 すみません。 実際はメンバに持たせてあるので、formが参照されている限りはGCの対象になることはないと思ったのでApplicationExitを使いました。
Zuishin

2016/07/26 10:07

GC の対象にはならないかもしれませんが、DestroyWindow() が呼ばれているので NG です。たとえ見直さなくてもこの問題がたまたま解決したとしても、それでも直すべきです。ほかのバグの巣になります。
aridai1221

2016/07/26 19:33

なるほど... ありがとうございます。
aridai1221

2016/07/27 22:04

解決しました。ありがとうございました。
guest

0

同様のアプリケーションを作ってみましたが、動作しました。
(といっても質問者様と異なり、WinフォームアプリからWinフォームアプリを起動するものですが)

Application.ApplicationExitのイベントハンドラの設定を確認したとのことですが、本当に設定されていますか?
設定されているイベントはそう簡単に取得できないので、例えばイベントハンドラを設定した直後にメッセージを表示するコードを追加して、System.Diagnostics.Process.Start()した後にメッセージが表示されることを確認するとか。

すでにそのような手順で確認済みでしたらすみません。

追記:
うろ覚えですみませんが、私が試したコードを記載します。
呼び出し元のアプリケーションでButton1をクリック後、Button2をクリックしてメッセージが表示されたことを確認しました。

c#

1// 呼び出し元のアプリケーションのForm 2System.Diagnostics.Process process; 3 4private void button1_Click(object sender, EventArgs e) 5{ 6 process = System.Diagnostics.Process.Start("test.exe"); 7} 8 9private void button2_Click(object sender, EventArgs e) 10{ 11 process.CloseMainWindow(); 12} 13 14 15// 呼び出し先のアプリケーションのProgram.cs 16static void Main() 17{ 18 var form = new Form1(); 19 Application.ApplicationExit += (_, __) => form.Foo(); 20 Application.Run(form); 21} 22 23// 呼び出し先のアプリケーションのForm1 24public void Foo() 25{ 26 MessageBox.Show("Application.Exit"); 27}

投稿2016/07/26 08:02

編集2016/07/26 09:53
gusao

総合スコア185

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aridai1221

2016/07/26 08:10

回答ありがとうございます。 public static void Main() { var form = new Hoge(); Application.ApplicationExit += (_, __) => form.Foo(); Application.Run(form); } のようにしているので 絶対にイベントハンドラを登録できているとは思います。
gusao

2016/07/26 08:29

となると、Unityから起動しているせいですかね?当方Unityの環境がないのでわかりませんが… 試しに、Winフォームアプリから起動してもダメでしょうか?
aridai1221

2016/07/26 09:13

gusaoさんが試されたコードを載せてもらってもいいですか。
gusao

2016/07/26 09:53

コードを記載してみました。
aridai1221

2016/07/26 19:35

ありがとうございます。 載せていただいたコードは 私の書いたコードと同じような感じでした。 もう一度Unity環境で実験してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問