次の方法で共有


出力ウィンドウを拡張する

出力ウィンドウは、一連の読み取り/書き込みテキスト ウィンドウです。 Visual Studio には、プロジェクトによってビルドに関するメッセージを伝達するビルドと Visual Studio によって IDE に関するメッセージを伝達する全般という組み込みのウィンドウがあります。 プロジェクトでは、IVsBuildableProjectCfg インターフェイス メソッドを使用して、ビルド ウィンドウへの参照が自動的に取得され、Visual Studio によって、SVsGeneralOutputWindowPane サービスから、全般ウィンドウに直接アクセスできます。 組み込みのウィンドウに加えて、独自のカスタム ウィンドウを作成して管理することもできます。

出力ウィンドウは、IVsOutputWindow インターフェイスと IVsOutputWindowPane インターフェイスを使用して直接制御できます。 SVsOutputWindow サービスによって提供される IVsOutputWindow インターフェイスは、出力ウィンドウ ペインを作成、取得、および破棄するためのメソッドを定義します。 IVsOutputWindowPane インターフェイスは、ウィンドウの表示、ウィンドウの非表示、およびそれらのテキストの操作を行うためのメソッドを定義します。 出力 ウィンドウを制御する別の方法として、Visual Studio オートメーション オブジェクト モデルの OutputWindow オブジェクトと OutputWindowPane オブジェクトを使用する方法があります。 これらのオブジェクトには、IVsOutputWindow インターフェイスと IVsOutputWindowPane インターフェイスのほぼすべての機能がカプセル化されています。 さらに、OutputWindow オブジェクトと OutputWindowPane オブジェクトにより、出力 ウィンドウ ペインの列挙やウィンドウからのテキストの取得を簡単に行える上位レベルの機能が追加されます。

出力ウィンドウを使用する拡張機能を作成する

出力ウィンドウのさまざまな側面を実行する拡張機能を作成できます。

  1. TestOutput という名前のメニュー コマンドを使用して、TestOutput という名前の VSIX プロジェクトを作成します。 詳細については、「メニュー コマンドを使用した拡張機能の作成」を参照してください。

  2. 次の参照を追加します:

    1. EnvDTE

    2. EnvDTE80

  3. TestOutput.cs に、次の using ステートメントを追加します。

    using EnvDTE;
    using EnvDTE80;
    
  4. TestOutput.csで、ShowMessageBoxメソッドを削除します。 次のメソッド スタブを追加します。

    private void OutputCommandHandler(object sender, EventArgs e)
    {
    }
    
  5. TestOutput コンストラクターで、コマンド ハンドラーを OutputCommandHandler に変更します。 コマンドを追加する部分を次に示します。

    OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if (commandService != null)
    {
        CommandID menuCommandID = new CommandID(MenuGroup, CommandId);
        EventHandler eventHandler = OutputCommandHandler;
        MenuCommand menuItem = new MenuCommand(eventHandler, menuCommandID);
        commandService.AddCommand(menuItem);
    }
    
  6. 以下のセクションでは、出力ペインを扱うさまざまな方法を示すさまざまなメソッドを紹介します。 これらのメソッドは、OutputCommandHandler() メソッドの本体に対して呼び出すことができます。 たとえば、次のコードでは、次のセクションで示されている CreatePane() メソッドを追加します。

    private void OutputCommandHandler(object sender, EventArgs e)
    {
        CreatePane(new Guid(), "Created Pane", true, false);
    }
    

IVsOutputWindow を使用して出力ウィンドウを作成する

この例では、IVsOutputWindow インターフェイスを使用して、新しい 出力 ウィンドウ ペインを作成する方法を示します。

void CreatePane(Guid paneGuid, string title,
    bool visible, bool clearWithSolution)
{
    IVsOutputWindow output =
        (IVsOutputWindow)GetService(typeof(SVsOutputWindow));
    IVsOutputWindowPane pane;

    // Create a new pane.
    output.CreatePane(
        ref paneGuid,
        title,
        Convert.ToInt32(visible),
        Convert.ToInt32(clearWithSolution));

    // Retrieve the new pane.
    output.GetPane(ref paneGuid, out pane);

     pane.OutputString("This is the Created Pane \n");
}

前のセクションで指定した拡張機能にこのメソッドを追加した場合、[TestOutput の呼び出し] コマンドをクリックすると、ウィンドウ自体に出力元の表示: CreatedPaneThis is the Created Pane という語句を示すヘッダーのある出力ウィンドウが表示されるはずです。

OutputWindow を使用して出力ウィンドウを作成する

この例では、OutputWindow オブジェクトを使って出力ウィンドウ ペインを作成する方法を示します。

void CreatePane(string title)
{
    DTE2 dte = (DTE2)GetService(typeof(DTE));
    OutputWindowPanes panes =
        dte.ToolWindows.OutputWindow.OutputWindowPanes;

    try
    {
        // If the pane exists already, write to it.
        panes.Item(title);
    }
    catch (ArgumentException)
    {
        // Create a new pane and write to it.
        panes.Add(title);
    }
}

OutputWindowPanes コレクションによって、出力ウィンドウ ペインをタイトルで取得できますが、ウィンドウのタイトルは確実に一意であるとは限りません。 タイトルが一意であるか疑わしい場合は、GetPane メソッドを使用して、正しいウィンドウをその GUID で取得します。

前のセクションで指定した拡張機能にこのメソッドを追加した場合、[TestOutput の呼び出し] コマンドをクリックすると、ウィンドウ自体に出力元の表示: DTEPaneAdded DTE Pane という語句を示すヘッダーのある出力ウィンドウが表示されるはずです。

出力ウィンドウを削除する

この例では、出力ウィンドウ ペインを削除する方法を示します。

void DeletePane(Guid paneGuid)
{
    IVsOutputWindow output =
    (IVsOutputWindow)ServiceProvider.GetService(typeof(SVsOutputWindow));

    IVsOutputWindowPane pane;
    output.GetPane(ref paneGuid, out pane);

    if (pane == null)
    {
        CreatePane(paneGuid, "New Pane\n", true, true);
    }
     else
    {
        output.DeletePane(ref paneGuid);
    }
}

前のセクションで指定した拡張機能にこのメソッドを追加した場合、[TestOutput の呼び出し] コマンドをクリックすると、ウィンドウ自体に出力元の表示: New PaneAdded Created Pane という語句を示すヘッダーのある出力ウィンドウが表示されるはずです。 [TestOutput の呼び出し] コマンドをもう一度クリックすると、ウィンドウが削除されます。

出力ウィンドウの全般ウィンドウを取得する

この例では、出力ウィンドウの組み込みの全般ウィンドウを取得する方法を示します。

IVsOutputWindowPane GetGeneralPane()
{
    return (IVsOutputWindowPane)GetService(
        typeof(SVsGeneralOutputWindowPane));
}

前のセクションで指定した拡張機能にこのメソッドを追加した場合、[TestOutput の呼び出し] コマンドをクリックすると、ウィンドウにAdded Created Pane という単語を示すヘッダーのある出力ウィンドウが表示されるはずです。

出力ウィンドウのビルド ウィンドウを取得する

この例では、ビルド ウィンドウを見つけて、それに書き込む方法を示します。 ビルド ウィンドウは既定でアクティブにされていないため、アクティブにします。

void OutputTaskItemStringExExample(string buildMessage)
{
    EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)ServiceProvider.GetService(typeof(EnvDTE.DTE));

    EnvDTE.OutputWindowPanes panes =
        dte.ToolWindows.OutputWindow.OutputWindowPanes;
    foreach (EnvDTE.OutputWindowPane pane in panes)
        {
            if (pane.Name.Contains("Build"))
            {
                pane.OutputString(buildMessage + "\n");
                pane.Activate();
                return;
             }
        }
}