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

外部アプリケーションを起動する、ファイルを関連付けられたソフトで開く

ここでは、外部アプリケーションを実行ファイルを指定して起動する方法について説明します。また、ファイルを関連付けられたアプリケーションで開く方法についても説明します。

Process.Startメソッドを使用して、外部アプリケーションを起動させる

外部アプリケーションを起動させるには、ProcessクラスのStartメソッドを使用します。使い方はとても簡単で、起動したいアプリケーションの実行ファイルのパスを指定してProcess.Startメソッドを呼び出すだけです。

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

VB.NET
コードを隠すコードを選択
'メモ帳を起動する
Dim p As System.Diagnostics.Process = _
    System.Diagnostics.Process.Start("notepad.exe")
C#
コードを隠すコードを選択
//メモ帳を起動する
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"」を指定してメモ帳を起動しています。

VB.NET
コードを隠すコードを選択
'コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動する
System.Diagnostics.Process.Start("notepad.exe", """C:\test\1.txt""")
C#
コードを隠すコードを選択
//コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動する
System.Diagnostics.Process.Start("notepad.exe", @"""C:\test\1.txt""");
補足:上の例ではコマンドライン引数であるファイルのパスをダブルコーテーションで囲んでいますが、これはファイルのパスに空白文字が含まれている場合、1つの引数として認識されなくなってしまうのを防ぐための処置です。

ProcessStartInfoオブジェクトを使ってProcess.Startメソッドを呼び出す

Process.Startメソッドは、ProcessStartInfoオブジェクトを指定して呼び出すこともできます。この方法を使えば、さらに高度な設定でアプリケーションを起動することもできます。具体的にどのようなことができるかは、「プロセス編メニュー」をご覧ください。

以下にこの方法でメモ帳を起動する例を示します。

VB.NET
コードを隠すコードを選択
'ProcessStartInfoオブジェクトを作成する
Dim psi As New System.Diagnostics.ProcessStartInfo()
'起動する実行ファイルのパスを設定する
psi.FileName = "notepad.exe"
'起動する
Dim p As System.Diagnostics.Process = _
    System.Diagnostics.Process.Start(psi)
C#
コードを隠すコードを選択
//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"」を指定してメモ帳を起動しています。

VB.NET
コードを隠すコードを選択
'ProcessStartInfoオブジェクトを作成する
Dim psi As New System.Diagnostics.ProcessStartInfo()
'起動するファイルのパスを指定する
psi.FileName = "notepad.exe"
'コマンドライン引数を指定する
psi.Arguments = """C:\test\1.txt"""

'アプリケーションを起動する
System.Diagnostics.Process.Start(psi)
C#
コードを隠すコードを選択
//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メソッドを呼び出す

Process.Startメソッドには、パラメータのないインスタンスメソッドもあります。このメソッドの返り値はBoolean型で、プロセスが起動した時にTrue、それ以外の時はFalseを返します。

インスタンスメソッドを使う例は、以下のようになります。

VB.NET
コードを隠すコードを選択
'Processオブジェクトを作成する
Dim p As New System.Diagnostics.Process()
'起動する実行ファイルのパスを設定する
p.StartInfo.FileName = "notepad.exe"
'起動する。プロセスが起動した時はTrueを返す。
Dim result As Boolean = p.Start()
C#
コードを隠すコードを選択
//Processオブジェクトを作成する
System.Diagnostics.Process p = new System.Diagnostics.Process();
//起動する実行ファイルのパスを設定する
p.StartInfo.FileName = "notepad.exe";
//起動する。プロセスが起動した時はTrueを返す。
bool result = p.Start();

この方法でコマンドライン引数を指定するには、Process.StartInfoプロパティで取得できるProcessStartInfoオブジェクトのArgumentsプロパティを使用します。

VB.NET
コードを隠すコードを選択
'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()
C#
コードを隠すコードを選択
//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メソッドを呼び出す

VB.NETであれば、Interaction.Shellメソッドを使う方法もあります。

下の例では、メモ帳を「"C:\test\1.txt"」というコマンドライン引数で起動しています。

VB.NET
コードを隠すコードを選択
'"notepad.exe"を"C:\test\1.txt"というコマンドライン引数で起動する
Shell("""notepad.exe"" ""C:\test\1.txt""")

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

ファイルを関連付けられたアプリケーションで開く場合も、今まで紹介したのと全く同じ方法でできます(Interaction.Shellメソッドを使った方法は除きます)。

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

VB.NET
コードを隠すコードを選択
'"C:\test\1.txt"を関連付けられたアプリケーションで開く
Dim p As System.Diagnostics.Process = _
    System.Diagnostics.Process.Start("C:\test\1.txt")
C#
コードを隠すコードを選択
//"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を使います。
  • 履歴:
  • 2013/9/8 「外部アプリケーションを起動する、ファイルを関連付けられたソフトで開く」方法のみを説明する内容に変更。

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

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。