DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

外部アプリケーションを起動して終了まで待機する
ファイルを関連付けられたアプリケーションで開いて終了まで待機する

外部アプリケーションを起動させる

外部アプリケーションを起動させるには、ProcessクラスのStartメソッドを使用します。

下の例では、メモ帳を起動しています。

VB.NET
コードを隠すコードを選択
System.Diagnostics.Process.Start("notepad.exe")
C#
コードを隠すコードを選択
System.Diagnostics.Process.Start("notepad.exe");

ファイルを関連付けられたアプリケーションで開く

ファイルを関連付けられたアプリケーションで開く場合も上記と全く同じです。

下の例では、"C:\test.txt"を関連付けられたアプリケーションで開いています。

VB.NET
コードを隠すコードを選択
System.Diagnostics.Process.Start("C:\test.txt")
C#
コードを隠すコードを選択
System.Diagnostics.Process.Start("C:\\test.txt");

起動したアプリケーションが終了するまで待機する

さらに終了まで待機するには次のようにProcessクラスのWaitForExitメソッドを使用します。このとき同期的に待機するため待機中はフリーズしたようになります。

VB.NET
コードを隠すコードを選択
'ファイルを開いて終了まで待機する
Dim p As System.Diagnostics.Process = _
    System.Diagnostics.Process.Start("C:\test.txt")
p.WaitForExit()
'ここを次のようにすると最大10秒間だけ待機する
'p.WaitForExit(10000)
MsgBox("終了。")
C#
コードを隠すコードを選択
//ファイルを開いて終了まで待機する
System.Diagnostics.Process p =
    System.Diagnostics.Process.Start("C:\\test.txt");
p.WaitForExit();
//ここを次のようにすると最大10秒間だけ待機する
//p.WaitForExit(10000);
MessageBox.Show("終了。");

プロセスの終了を非同期で待機する

次の例ではプロセスの終了まで非同期で待機しています。Button1をクリックしてメモ帳を起動し、メモ帳が終了するとp_Exitedが呼び出されます。

VB.NET
コードを隠すコードを選択
'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Button1.Click
    'Processオブジェクトを作成する
    Dim p As New System.Diagnostics.Process()
    '起動するファイルを指定する
    p.StartInfo.FileName = "notepad.exe"
    'イベントハンドラがフォームを作成したスレッドで実行されるようにする
    p.SynchronizingObject = Me
    'イベントハンドラの追加
    AddHandler p.Exited, New EventHandler(AddressOf p_Exited)
    'プロセスが終了したときに Exited イベントを発生させる
    p.EnableRaisingEvents = True
    '起動する
    p.Start()
End Sub

Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
    'プロセスが終了したときに実行される
    MessageBox.Show("終了しました。")
End Sub
C#
コードを隠すコードを選択
//Button1のClickイベントハンドラ
private void button1_Click(object sender, System.EventArgs e)
{
    //Processオブジェクトを作成する
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    //起動するファイルを指定する
    p.StartInfo.FileName = "notepad.exe";
    //イベントハンドラがフォームを作成したスレッドで実行されるようにする
    p.SynchronizingObject = this;
    //イベントハンドラの追加
    p.Exited += new EventHandler(p_Exited);
    //プロセスが終了したときに Exited イベントを発生させる
    p.EnableRaisingEvents = true;
    //起動する
    p.Start();
}

private void p_Exited(object sender, EventArgs e)
{
    //プロセスが終了したときに実行される
    MessageBox.Show("終了しました。");
}

上の例では、コードだけですべて行いましたが、Visual Studioのフォームデザイナを使用すれば、「ツールボックス」の「コンポーネント」タブにある「Process」をフォームに配置するだけで簡単に使用できます。

注意:非同期で監視を行う場合、SynchronizingObjectの意味等のマルチスレッドプログラミングの知識がないと危険です。これについて詳しくは、こちらをご覧ください。
  • 履歴:
  • 2010/10/14 「起動したアプリケーションが終了するまで待機する」のコードを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。