ここでは、外部アプリケーションを実行ファイルを指定して起動する方法について説明します。また、ファイルを関連付けられたアプリケーションで開く方法についても説明します。
外部アプリケーションを起動させるには、ProcessクラスのStartメソッドを使用します。使い方はとても簡単で、起動したいアプリケーションの実行ファイルのパスを指定してProcess.Startメソッドを呼び出すだけです。
下の例では、メモ帳を起動しています。
'メモ帳を起動する Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("notepad.exe")
//メモ帳を起動する
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("notepad.exe");
Startメソッドでプロセスが起動した時、Startメソッドはそのプロセスを表すProcessオブジェクトを返します。プロセスが既に起動していて、そのプロセスが再利用された場合は、null(VB.NETでは、Nothing)を返します。例えば、後述する「ファイルを関連付けられたアプリケーションで開く」方法でインターネットエクスプローラ(IE)を起動しようとした時、すでにIEが起動していればそのプロセスでファイルが開かれる場合があり、その時はnullが返されます。
補足:Windowsフォトビューアーを「ファイルを関連付けられたアプリケーションで開く」方法で起動させた場合も、Process.Startはnullを返します。Windowsフォトビューアーの実体は「dllhost.exe」ですが、これはフォトビューアーだけのものではなく、フォトビューアーが起動しているかしていないかにかかわらず実行され続けています。そのため、Process.Startでフォトビューアーを起動するとプロセスリソースが再利用され、Process.Startはnullを返します。
Process.Startメソッドの2番目の引数には、実行ファイルを起動する時に使用するコマンドライン引数を指定することができます。下の例では、コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動しています。
'コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動する
System.Diagnostics.Process.Start("notepad.exe", """C:\test\1.txt""")
//コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動する
System.Diagnostics.Process.Start("notepad.exe", @"""C:\test\1.txt""");
補足:上の例ではコマンドライン引数であるファイルのパスをダブルコーテーションで囲んでいますが、これはファイルのパスに空白文字が含まれている場合、1つの引数として認識されなくなってしまうのを防ぐための処置です。
Process.Startメソッドは、ProcessStartInfoオブジェクトを指定して呼び出すこともできます。この方法を使えば、さらに高度な設定でアプリケーションを起動することもできます。具体的にどのようなことができるかは、「プロセス編メニュー」をご覧ください。
以下にこの方法でメモ帳を起動する例を示します。
'ProcessStartInfoオブジェクトを作成する Dim psi As New System.Diagnostics.ProcessStartInfo() '起動する実行ファイルのパスを設定する psi.FileName = "notepad.exe" '起動する Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start(psi)
//ProcessStartInfoオブジェクトを作成する System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(); //起動する実行ファイルのパスを設定する psi.FileName = "notepad.exe"; //起動する System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
この方法でコマンドライン引数を指定するには、ProcessStartInfo.Argumentsプロパティを使用します。下の例では、コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動しています。
'ProcessStartInfoオブジェクトを作成する Dim psi As New System.Diagnostics.ProcessStartInfo() '起動するファイルのパスを指定する psi.FileName = "notepad.exe" 'コマンドライン引数を指定する psi.Arguments = """C:\test\1.txt""" 'アプリケーションを起動する System.Diagnostics.Process.Start(psi)
//ProcessStartInfoオブジェクトを作成する System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(); //起動するファイルのパスを指定する psi.FileName = "notepad.exe"; //コマンドライン引数を指定する psi.Arguments = @"""C:\test\1.txt"""; //アプリケーションを起動する System.Diagnostics.Process.Start(psi);
Process.Startメソッドには、パラメータのないインスタンスメソッドもあります。このメソッドの返り値はBoolean型で、プロセスが起動した時にTrue、それ以外の時はFalseを返します。
インスタンスメソッドを使う例は、以下のようになります。
'Processオブジェクトを作成する Dim p As New System.Diagnostics.Process() '起動する実行ファイルのパスを設定する p.StartInfo.FileName = "notepad.exe" '起動する。プロセスが起動した時はTrueを返す。 Dim result As Boolean = p.Start()
//Processオブジェクトを作成する System.Diagnostics.Process p = new System.Diagnostics.Process(); //起動する実行ファイルのパスを設定する p.StartInfo.FileName = "notepad.exe"; //起動する。プロセスが起動した時はTrueを返す。 bool result = p.Start();
この方法でコマンドライン引数を指定するには、Process.StartInfoプロパティで取得できるProcessStartInfoオブジェクトのArgumentsプロパティを使用します。
'Processオブジェクトを作成する Dim p As New System.Diagnostics.Process() '起動する実行ファイルのパスを設定する p.StartInfo.FileName = "notepad.exe" 'コマンドライン引数を指定する p.StartInfo.Arguments = """C:\test\1.txt""" '起動する。プロセスが起動した時はTrueを返す。 Dim result As Boolean = p.Start()
//Processオブジェクトを作成する System.Diagnostics.Process p = new System.Diagnostics.Process(); //起動する実行ファイルのパスを設定する p.StartInfo.FileName = "notepad.exe"; //コマンドライン引数を指定する p.StartInfo.Arguments = @"""C:\test\1.txt"""; //起動する。プロセスが起動した時はTrueを返す。 bool result = p.Start();
補足:静的なProcess.Startメソッドは内部でProcessオブジェクトを作成し、インスタンスメソッドのStartメソッドを呼び出し、StartメソッドがTrueを返した時はProcessオブジェクトを、Falseを返した時はnullを返しています。
VB.NETであれば、Interaction.Shellメソッドを使う方法もあります。
下の例では、メモ帳を「"C:\test\1.txt"」というコマンドライン引数で起動しています。
'"notepad.exe"を"C:\test\1.txt"というコマンドライン引数で起動する
Shell("""notepad.exe"" ""C:\test\1.txt""")
ファイルを関連付けられたアプリケーションで開く場合も、今まで紹介したのと全く同じ方法でできます(Interaction.Shellメソッドを使った方法は除きます)。
下の例では、「C:\test\1.txt」を関連付けられたアプリケーションで開いています。
'"C:\test\1.txt"を関連付けられたアプリケーションで開く Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("C:\test\1.txt")
//"C:\test\1.txt"を関連付けられたアプリケーションで開く
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("C:\\test\\1.txt");
ただしこの場合は、ProcessStartInfo.UseShellExecuteプロパティがTrueである必要があります。ProcessStartInfoオブジェクトを使ってProcess.Startメソッドを呼び出す場合や、インスタンスメソッドのProcess.Startを呼び出す場合はUseShellExecuteプロパティがFalseになる可能性もありますので、注意が必要です(デフォルトはTrueですので、意図的に変更しなければ大丈夫です)。
補足:Process.Startメソッドは、ProcessStartInfo.UseShellExecuteプロパティがTrueの時は、ShellExecuteExを使ってプロセスを起動します。UseShellExecuteプロパティがFalseの時は、ProcessStartInfo.UserNameプロパティが設定されていればCreateProcessWithLogonWを、いなければCreateProcessを使います。Interaction.Shellメソッドは、CreateProcessを使います。