扩展输出窗口
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。
输出窗口是一组的读/写文本窗格。 Visual Studio 提供了这些内置窗格︰生成,有关生成,消息通信中的项目和常规,在其中Visual Studio将有关 IDE 的消息传递。 项目将获得对引用生成窗格中会自动通过IVsBuildableProjectCfg接口方法和 Visual Studio 提供了直接访问常规窗格中,通过SVsGeneralOutputWindowPane服务。 除了内置的窗格中,您可以创建和管理您自己的自定义窗格。
您可以控制输出窗口直接通过IVsOutputWindow和IVsOutputWindowPane接口。 IVsOutputWindow接口,提供的SVsOutputWindow服务,定义用于创建、 检索和销毁方法输出窗口窗格。 IVsOutputWindow接口定义用于显示窗格、 隐藏窗格,和操作其文本的方法。 控制的一种替代方式输出窗口是通过OutputWindow和OutputWindowPane Visual Studio 自动化对象模型中的对象。 这些对象将封装几乎所有的功能IVsOutputWindow和IVsOutputWindowPane接口。 此外, OutputWindow和OutputWindowPane对象添加一些更高级别的功能,以便更加轻松地枚举输出窗口窗格并从窗格中检索文本。
您可以练习输出窗格中的不同方面的扩展。
-
创建一个名为的 VSIX 项目
TestOutput
与菜单命令名为TestOutput。 有关详细信息,请参阅使用菜单命令创建扩展。 -
添加以下引用︰
-
EnvDTE
-
EnvDTE80
-
-
在 TestOutput.cs,添加以下 using 语句︰
using EnvDTE; using EnvDTE80;
-
在 TestOutput.cs,删除 ShowMessageBox 方法。 添加以下方法存根 (stub)︰
private void OutputCommandHandler(object sender, EventArgs e) { }
-
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); }
-
以下各部分具有不同显示不同的方法来处理输出窗格中的方法。 可以调用这些方法来 OutputCommandHandler() 方法的主体。 例如,以下代码添加的下一节中给出的 CreatePane() 方法。
private void OutputCommandHandler(object sender, EventArgs e) { CreatePane(new Guid(), "Created Pane", true, false); }
此示例演示如何创建一个新输出窗口窗格中,通过使用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命令应看到输出窗口使用标头指出显示输出来源︰ CreatedPane和文字这是创建窗格中本身的窗格中。
此示例演示如何创建输出窗口窗格中,通过使用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. return panes.Add(title); } }
尽管OutputWindowPanes集合使你能够检索输出窗口窗格中,通过其标题,窗格标题不能保证是唯一的。 当您不能确定一个标题的唯一性时,使用GetPane方法来检索由其 GUID 正确窗格。
如果将此方法添加到给定的前面部分中,当您单击扩展调用 TestOutput您应该看到使用标头指出输出窗口的命令显示输出来源︰ DTEPane和文字添加 DTE 窗格本身的窗格中。
此示例演示如何删除输出窗口窗格。
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命令同样,窗格中删除。
此示例演示如何获取内置常规窗格输出窗口。
void GetGeneralPane() { return (IVsOutputWindowPane)GetService( typeof(SVsGeneralOutputWindowPane)); }
如果将此方法添加到给定的前面部分中,当您单击扩展调用 TestOutput命令您应该会看到输出窗口显示单词找到常规窗格在窗格中。
此示例演示如何查找生成窗格中,并向其中写入数据。 由于默认情况下,不激活生成窗格中,则会激活它还。
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; } } }