「[ VB.NET / C# ] プロセスの終了を待機する ( Process.WaitForExit )」では、プロセスの終了を同期待機を行う方法を確認しましたが、待機中は他の処理をすることができません。ここでは、Process.Exited イベントハンドラを設定して非同期にプロセスの終了を捕捉する方法を確認しています。
スポンサーリンク
また、下記のサンプルのように ProcessStartInfo クラスを使用してプロセスを起動することで詳細な動作設定を行うことができます。ここでは、フォームを持たないアプリケーションをコマンドプロンプト画面を表示させずに起動させています。
プロセスの終了を捕捉する
VB.NET
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
' ProcessStartInfo の新しいインスタンスを生成する
Dim pi As ProcessStartInfo = New ProcessStartInfo()
pi.FileName = "起動するファイルのパス" ' 起動するアプリケーション
pi.Arguments = "パラメータ文字列" ' 起動パラメータ
pi.UseShellExecute = False ' シェルを使用しない
pi.ErrorDialog = True ' 起動できなかった時にエラーダイアログを表示する
pi.ErrorDialogParentHandle = Me.Handle ' エラーダイアログを表示する親ハンドル(自フォーム)
pi.WorkingDirectory = "起動ディレクトリパス" ' 多くは実行ファイルのディレクトリ
pi.CreateNoWindow = True ' コマンドプロンプトは非表示にする
' プロセスの起動
Dim proc As Process = Process.Start(pi)
' プロセスが終了したときに Exited イベントを発生させる
proc.EnableRaisingEvents = True
' Windows フォームのコンポーネントを設定して、コンポーネントが作成されているスレッドと
' 同じスレッドで Exited イベントを処理するメソッドが呼び出されるようにする
proc.SynchronizingObject = Me
' プロセス終了時に呼び出される Exited イベントハンドラの設定
AddHandler proc.Exited, AddressOf Process_Exited
End Sub
' プロセスの終了を捕捉する Exited イベントハンドラ
Private Sub Process_Exited(ByVal sender As Object, ByVal e As EventArgs)
Dim proc As Process = DirectCast(sender, Process)
MessageBox.Show("プロセスが終了しました。プロセスID:" + proc.Id.ToString())
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
// ProcessStartInfo の新しいインスタンスを生成する
System.Diagnostics.ProcessStartInfo pi = new System.Diagnostics.ProcessStartInfo();
pi.FileName = "起動するファイルのパス"; // 起動するアプリケーション
pi.Arguments = "パラメータ文字列"; // 起動パラメータ
pi.UseShellExecute = false; // シェルを使用しない
pi.ErrorDialog = true; // 起動できなかった時にエラーダイアログを表示する
pi.ErrorDialogParentHandle = this.Handle; // エラーダイアログを表示する親ハンドル(自フォーム)
pi.WorkingDirectory = "起動ディレクトリパス"; // 多くは実行ファイルのディレクトリ
pi.CreateNoWindow = true; // コマンドプロンプトは非表示にする
// プロセスの起動
System.Diagnostics.Process proc = System.Diagnostics.Process.Start(pi);
// プロセスが終了したときに Exited イベントを発生させる
proc.EnableRaisingEvents = true;
// Windows フォームのコンポーネントを設定して、コンポーネントが作成されているスレッドと
// 同じスレッドで Exited イベントを処理するメソッドが呼び出されるようにする
proc.SynchronizingObject = this;
// プロセス終了時に呼び出される Exited イベントハンドラの設定
proc.Exited += new EventHandler(Process_Exited);
}
// プロセスの終了を捕捉する Exited イベントハンドラ
private void Process_Exited(object sender, EventArgs e )
{
System.Diagnostics.Process proc = (System.Diagnostics.Process)sender;
MessageBox.Show("プロセスが終了しました。プロセスID:" + proc.Id.ToString());
}
参考
なんでちゃんとメインメソッドまで記述しないの? バカなの?