2009年6月11日木曜日

外部アプリケーションを起動して終了まで待機する

外部アプリケーションを起動させる
外部アプリケーションを起動させるには、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]
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'ファイルを開いて終了まで待機する
Dim p As System.Diagnostics.Process = _
System.Diagnostics.Process.Start("notepad.exe")
'プロセスが終了したときに Exited イベントを発生させる
p.EnableRaisingEvents = True
'イベントハンドラがフォームを作成したスレッドで実行されるようにする
p.SynchronizingObject = Me
'イベントハンドラの追加
AddHandler p.Exited, AddressOf p_Exited
End Sub
Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
'プロセスが終了したときに実行される
MsgBox("終了しました。")
End Sub
[C#]
private void Button1_Click(object sender, System.EventArgs e)
{
//ファイルを開いて終了まで待機する
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("notepad.exe");
//プロセスが終了したときに Exited イベントを発生させる
p.EnableRaisingEvents = true;
//イベントハンドラがフォームを作成したスレッドで実行されるようにする
p.SynchronizingObject = this;
//イベントハンドラの追加
p.Exited += new EventHandler(p_Exited);
}
private void p_Exited(object sender, EventArgs e)
{
//プロセスが終了したときに実行される
MessageBox.Show("終了しました。");
}
注):上の例では、コードだけですべて行いましたが、Visual Studioのフォームデザイナを使用すれば、「ツールボックス」の「コンポーネント」タブにある「Process」をフォームに配置するだけで簡単に使用できます。
注意:非同期で監視を行う場合、SynchronizingObjectの意味等のマルチスレッドプログラミングの知識がないと危険です。

0 件のコメント:

コメントを投稿