.NET TIPS

ほかのアプリケーションを起動して入力可能になるまで待つには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2009/02/05

 「TIPS:ほかのアプリケーションを実行するには?」では、外部アプリケーションの起動方法を解説したが、起動に続けて、そのアプリケーションを操作したいような場合には、それが実際に利用できるようになるまで待つ必要がある。たいていのアプリケーションは、実行ファイルが起動されてから、それが実際に利用できるようになるまでに初期化などで時間がかかるためだ。

 どれくらい待つ必要があるかは当然ながらアプリケーションによって異なるが、Processクラス(System.Diagnostics名前空間)には、プロセスがユーザー入力(マウスやキーボードの操作など)を受け付けることができるアイドル状態*になるまで待機するためのWaitForInputIdleメソッドが用意されている。

* より正確には、Windowsアプリケーションが持つメッセージ・ループがメッセージ待ちとなっている状態。

 WaitForInputIdleメソッドはインスタンス・メソッドであるため、これを呼び出すには、まずProcessクラスのインスタンスを作成し、そのStartメソッドによりアプリケーションを実行している必要がある(既存のプロセスに対して呼び出す場合は、Process.GetProcessesメソッドなどにより、そのProcessオブジェクトを取得する)。

 次のコードはWaitForInputIdleメソッドを使った簡易なベンチマーク用プログラムで、アプリケーションの起動時間を計測するためのものだ。これは、外部アプリケーションを起動し、その起動が完了するまでWaitForInputIdleメソッドを使って待機し、すぐにCloseMainWindowメソッドでウィンドウを閉じるという動作を何回か繰り返す。

// startbench.cs

using System;
using System.Diagnostics;

class Program {
  static void Main(string[] args) {

    string app = args[0]; // 起動する実行ファイルのパス
    int num = 10; // 繰り返し回数

    Stopwatch sw = new Stopwatch();

    sw.Start(); // 時間計測開始
    for (int i = 0; i < num; i++) {
      Console.Write(".");

      Process p = new Process();

      p.StartInfo.FileName = app;
      // p.StartInfo.Arguments = "……" // 起動オプションがある場合
      p.Start(); // 起動

      p.WaitForInputIdle(); // 起動完了待ち
      p.CloseMainWindow(); // ウィンドウを閉じる
    }
    sw.Stop(); // 時間計測終了

    Console.WriteLine();
    Console.WriteLine("起動回数:" + num);
    Console.WriteLine("合計時間:" + sw.Elapsed);
    Console.WriteLine(
        "平均時間:" + sw.ElapsedMilliseconds / num + "ミリ秒");
  }
}

// コンパイル方法:csc startbench.cs
// 実行例:startbench.exe c:\WINDOWS\NOTEPAD.EXE
アプリケーションの起動時間を測定するC#のサンプル・プログラム(startbench.cs)

' startbench.vb

Imports System
Imports System.Diagnostics

Class Program
  Shared Sub Main(ByVal args As String())

    Dim app As String = args(0) ' 起動する実行ファイルのパス
    Dim num As Integer = 10 ' 繰り返し回数

    Dim sw As New Stopwatch()

    sw.Start() ' 時間計測開始
    For i As Integer = 1 To 10
      Console.Write(".")

      Dim p As New Process()

      p.StartInfo.FileName = app
      ' p.StartInfo.Arguments = "……" ' 起動オプションがある場合
      p.Start() ' 起動

      p.WaitForInputIdle() ' 起動完了待ち
      p.CloseMainWindow() ' ウィンドウを閉じる
    Next
    sw.Stop() ' 時間計測終了

    Console.WriteLine()
    Console.WriteLine("起動回数:" & num)
    Console.WriteLine("合計時間:" & sw.Elapsed.ToString())
    Console.WriteLine( _
        "平均時間:" & sw.ElapsedMilliseconds / num & "ミリ秒")
  End Sub
End Class

' コンパイル方法:vbc startbench.vb
' 実行例:startbench.exe c:\WINDOWS\NOTEPAD.EXE
アプリケーションの起動時間を測定するVBのサンプル・プログラム(startbench.vb)

 次の画面はこのサンプル・プログラムの実行結果例だ。例としてVisual Studio 2008の起動時間を測定している。


サンプル・プログラムの実行結果例

 なお、アプリケーションの作りやプロセス構造によっては、WaitForInputIdleメソッドの呼び出しがアプリケーション起動完了前に終了したり、呼び出しがいつまでも終了しなかったりする場合もあるため注意が必要だ。後者の場合には、最長待機時間を引数で指定できるWaitForInputIdleメソッドが利用できる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:Windows環境
使用ライブラリ:Processクラス(System.Diagnostics名前空間)
関連TIPS:ほかのアプリケーションを実行するには?

この記事と関連性の高い別の.NET TIPS
ほかのアプリケーションを実行してその終了を待つには?
ほかのアプリケーションを実行するには?
多重起動禁止時に実行中のWindowsアプリケーションを最前面に表示するには?
ほかのアプリを実行して終了コードを得るには?
起動時にタスクトレイのアイコンのみを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間