[ VB.NET / C# ] プロセスの終了を非同期に捕捉する ( Process.Exited )

Pocket

[ 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());
    }
参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *