コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?[C#、VB].NET TIPS

Windowsアプリケーションからコンソール・アプリケーションやバッチ・ファイルを起動する際、ただProcess.Startメソッドで実行するだけでは、余計なコマンド・プロンプトが開いてしまう。これをProcessStartInfoクラスによって解消する方法を解説する。

» 2007年10月04日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 Windowsアプリケーションなどから外部のコンソール・アプリケーション(.EXEファイル)やバッチ・ファイル(.BATファイル)を起動する場合、単純にProcessクラス(System.Diagnostics名前空間)のStartメソッド(静的メソッド)を使って実行*1しただけでは、余計なコマンド・プロンプト(正確にはコンソール・ウィンドウ)が開いて実行されてしまう。

*1 これについては「TIPS:ほかのアプリケーションを実行するには?」で解説している。


 特に、すぐ実行が完了するようなコンソール・アプリケーションの場合には、コンソール・ウィンドウが一瞬だけ開くことになり、非常に目障りなものとなる。本稿では、コンソール・ウィンドウを開かずに外部のコンソール・アプリケーションを実行する方法について解説する。

CreateNoWindowプロパティとUseShellExecuteプロパティの設定

 先に挙げたProcessクラスのStartメソッドでは、次のようにパラメータに実行ファイルのパスを直接指定することにより、簡単に外部アプリケーションを実行できる。

Process.Start(@"c:\MyApp\ConsoleApp.exe");

Process.Start("c:\MyApp\ConsoleApp.exe")

Process.Startメソッドによる外部アプリケーションの実行(上:C#、下:VB)
アプリケーションにコマンド引数を与える場合には、第2パラメータで指定する。このコードを記述する場合にはSystem.Diagnostics名前空間をインポートしている必要がある。

 しかし上述したように、これだけではアプリケーションがコンソール・アプリケーションである場合に、コンソール・ウィンドウが開いてしまう。

 コンソール・ウィンドウを開かずにコンソール・アプリケーションを実行するには、ProcessStartInfoクラス(System.Diagnostics名前空間)のオブジェクトによりプロセス起動時の詳細情報を設定しておき、そのオブジェクトをStartメソッドに渡してアプリケーションを起動すればよい。具体的には次のように記述して行う。

ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = @"c:\MyApp\ConsoleApp.exe"; // 実行するファイル
psInfo.CreateNoWindow = true; // コンソール・ウィンドウを開かない
psInfo.UseShellExecute = false; // シェル機能を使用しない

Process.Start(psInfo);

Dim psInfo As New ProcessStartInfo()
psInfo.FileName = "c:\MyApp\ConsoleApp.exe" ' 実行するファイル
psInfo.CreateNoWindow = True ' コンソール・ウィンドウを開かない
psInfo.UseShellExecute = False ' シェル機能を使用しない

Process.Start(psInfo)

コンソール・ウィンドウを開かずにコンソール・アプリケーションを実行(上:C#、下:VB)
CreateNoWindowプロパティをtrueに、UseShellExecuteプロパティをfalseに設定したProcessStartInfoオブジェクトをProcess.Startメソッドに渡して実行する。アプリケーションにコマンド引数を与える場合には、Argumentsプロパティで指定する。このコードを記述する場合にはSystem.Diagnostics名前空間をインポートしている必要がある。

 ここではProcessStartInfoオブジェクトの3つのプロパティについて値を設定している。順に見ていこう。

 FileNameプロパティには実行するアプリケーションのパスを指定する。これはStartメソッドを呼び出すのに最低限必要となるプロパティだ。

 続く2つがここでのポイントである。まずCreateNoWindowプロパティにはtrueを設定する。これにより、コンソール・アプリケーションが「コンソール・ウィンドウなし」で実行されるようになる(デフォルトはfalse)*2

 次のUseShellExecuteプロパティは、アプリケーションの実行に際してWindowsのシェル機能を使うかどうかを指定するが、これにはfalseを設定する(デフォルトはtrue)。

 このUseShellExecuteプロパティがtrueの場合には、例えばFileNameプロパティに「http://www.atmark.co.jp/」を指定することにより、そのURLのWebページを既定のブラウザで開くことができる。しかしコンソール・アプリケーションの場合には、シェル機能によりコンソール・ウィンドウが開かれてしまう。

*2 Windowsアプリケーションにおいて、.EXEファイルを実行する場合にはCreateNoWindowプロパティの設定は実際には不要(UseShellExecuteプロパティの設定のみでOK)だが、.BATファイルを実行する場合には、これを設定しておかないとコンソール・ウィンドウが開いてしまう。


 なお、外部のコンソール・アプリケーションを実行した場合には、結果確認などの目的でその出力が必要になる場合がある。その取得については別稿で解説する予定だ。

カテゴリ:クラス・ライブラリ 処理対象:Windows環境
使用ライブラリ:Processクラス(System.Diagnostics名前空間)
使用ライブラリ:ProcessStartInfoクラス(System.Diagnostics名前空間)


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。