4.9扩展输出窗口

扩展输出窗口

Visual Studio 2015
 

若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档

输出窗口是一组的读/写文本窗格。 Visual Studio 提供了这些内置窗格︰生成,有关生成,消息通信中的项目和常规,在其中Visual Studio将有关 IDE 的消息传递。 项目将获得对引用生成窗格中会自动通过IVsBuildableProjectCfg接口方法和 Visual Studio 提供了直接访问常规窗格中,通过SVsGeneralOutputWindowPane服务。 除了内置的窗格中,您可以创建和管理您自己的自定义窗格。

您可以控制输出窗口直接通过IVsOutputWindowIVsOutputWindowPane接口。 IVsOutputWindow接口,提供的SVsOutputWindow服务,定义用于创建、 检索和销毁方法输出窗口窗格。 IVsOutputWindow接口定义用于显示窗格、 隐藏窗格,和操作其文本的方法。 控制的一种替代方式输出窗口是通过OutputWindowOutputWindowPane Visual Studio 自动化对象模型中的对象。 这些对象将封装几乎所有的功能IVsOutputWindowIVsOutputWindowPane接口。 此外, OutputWindowOutputWindowPane对象添加一些更高级别的功能,以便更加轻松地枚举输出窗口窗格并从窗格中检索文本。

您可以练习输出窗格中的不同方面的扩展。

  1. 创建一个名为的 VSIX 项目TestOutput与菜单命令名为TestOutput。 有关详细信息,请参阅使用菜单命令创建扩展

  2. 添加以下引用︰

    1. EnvDTE

    2. EnvDTE80

  3. 在 TestOutput.cs,添加以下 using 语句︰

    F#
    using EnvDTE;  
    using EnvDTE80;  
    
    
  4. 在 TestOutput.cs,删除 ShowMessageBox 方法。 添加以下方法存根 (stub)︰

    C#
    private void OutputCommandHandler(object sender, EventArgs e)  
    {  
    }  
    
    
  5. TestOutput 构造函数中,将更改为 OutputCommandHandler 的命令处理程序。 下面是会将命令添加的部分︰

    C#
    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() 方法。

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

此示例演示如何创建一个新输出窗口窗格中,通过使用IVsOutputWindow接口。

C#
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命令应看到输出窗口使用标头指出显示输出来源︰ CreatedPane和文字这是创建窗格中本身的窗格中。

此示例演示如何创建输出窗口窗格中,通过使用OutputWindow对象。

C#
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.  
        return panes.Add(title);  
    }  
}  

尽管OutputWindowPanes集合使你能够检索输出窗口窗格中,通过其标题,窗格标题不能保证是唯一的。 当您不能确定一个标题的唯一性时,使用GetPane方法来检索由其 GUID 正确窗格。

如果将此方法添加到给定的前面部分中,当您单击扩展调用 TestOutput您应该看到使用标头指出输出窗口的命令显示输出来源︰ DTEPane和文字添加 DTE 窗格本身的窗格中。

此示例演示如何删除输出窗口窗格。

C#
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您应该看到使用标头指出输出窗口的命令显示输出来源︰ 新窗格和文字添加创建窗格本身的窗格中。 如果您单击调用 TestOutput命令同样,窗格中删除。

此示例演示如何获取内置常规窗格输出窗口。

C#
void GetGeneralPane()  
{  
    return (IVsOutputWindowPane)GetService(  
        typeof(SVsGeneralOutputWindowPane));  
}  

如果将此方法添加到给定的前面部分中,当您单击扩展调用 TestOutput命令您应该会看到输出窗口显示单词找到常规窗格在窗格中。

此示例演示如何查找生成窗格中,并向其中写入数据。 由于默认情况下,不激活生成窗格中,则会激活它还。

C#
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;  
             }  
        }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值