title author date CreateTime categories
VisualStudio 扩展开发 添加输出窗口
lindexi
2019-02-03 11:41:40 +0800
2019-02-03 09:31:58 +0800
VisualStudio

小伙伴都用过 VisualStudio 都在输出窗口看到不同的子窗口,如 gitlab 的输出窗口,调试的输出窗口,本文告诉大家如何写插件在输出窗口里面添加一个窗口

添加菜单 告诉大家如何简单在 VisualStudio 的工具添加一个按钮,通过用户点击按钮才能使用插件

于是请先看一下如何添加按钮的博客,这样本文就可以直接开始告诉大家在这篇博客 用到方法里面快速添加一个自定义的输出窗口

在输出窗口里面的窗口在 VisualStudio 官方的命名是 Pane 也就是本文是告诉大家如何在 VisualStudio 的 OutputWindow 添加一个 Pane 在这个 Pane 里面输出

在 VisualStudio 的 OutputWindow 包含了一组可读可写的文本 默认的 VisualStudio 会带很多的 Pane 如 Build 这是一个项目关于编译的输出,还有 General 这是 VisualStudio 这个工具的一些信息。通过 IVsBuildableProjectCfg 接口可以自动绑定输出到 Build 如调用编译。通过 SVsGeneralOutputWindowPane 服务可以直接访问 General 获取里面的输出。

开发者可以通过 VisualStudio SDK 创建管理自己的自定义窗口。

通过 IVsOutputWindowIVsOutputWindowPane 接口可以控制输出窗口。通过 SVsOutputWindow 服务可以拿到 IVsOutputWindow 接口。通过 IVsOutputWindow 可以获取到 IVsOutputWindowPane 或者创建关闭

通过 IVsOutputWindowPane 的方法可以激活 Pane 或隐藏 Pane 滚动里面的文本或清空输出

在开发 VisualStudio 插件的时候,因为文档不多,同时开发的时候会发现有一些文档没有更新,所以难度会比较大

创建自定义的输出窗口

在 Execute 方法,也就是 NowkuPurqicowFourocafem 的 Execute 方法,这个方法在这篇博客 已经有告诉大家,这个方法就是用户点击按钮的时候就会使用可以在这里添加一个 Pane 请看代码

也就是调用一个方法,这个方法是自己写的

通过 SVsOutputWindow 拿到 IVsOutputWindow 接口

    IVsOutputWindow output =
(IVsOutputWindow) Package.GetGlobalService(typeof(SVsOutputWindow));

这里的 Package 是 Microsoft.VisualStudio.Shell 是一个静态类里面的方法,除了使用静态类获取,还可以通过 NowkuPurqicowFourocafem 类里面的 package 获取,但是里面的获取方法是异步的

        /// <summary>
/// VS Package that provides this command, not null.
/// </summary>
private readonly AsyncPackage package;

这个字段是在 InitializeAsync 静态方法注入的

拿到了 IVsOutputWindow 就可以添加输出窗口

        void CreatePane(Guid paneGuid, string title,
bool visible, bool clearWithSolution)
{
ThreadHelper.ThrowIfNotOnUIThread(); IVsOutputWindow output =
(IVsOutputWindow)Package.GetGlobalService(typeof(SVsOutputWindow)); // Create a new pane.
output.CreatePane(
ref paneGuid,
title,
Convert.ToInt32(visible),
Convert.ToInt32(clearWithSolution));
}

这里传入的 paneGuid 是自己定义的,通过这个 paneGuid 就可以获取输出窗口

上面的代码只是创建,如果想要拿到 Pane 还需要调用这个方法

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

这样就可以拿到 IVsOutputWindowPane 接口

拿到了 IVsOutputWindowPane 就可以输出请看代码

            pane.OutputString("欢迎访问我博客 http://lindexi.gitee.io 里面有大量 UWP WPF 博客 \n"); 

除了通过 SVsOutputWindow 创建输出窗口,还可以使用 OutputWindow 创建输出窗口

添加 CreatePane 重载

void CreatePane(string title)
{ }

现在通过 package 拿到 DTE 通过 DTE 可以拿到输出窗口

        private async void CreatePane(string title)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE))
}

通过 package 需要使用异步的方法拿到服务

            OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes;

但是 OutputWindowPanes 不是列表,需要通过下面的代码去拿到 Pane 或创建

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

虽然通过异常判断是否已经存在 Pane 不存在就创建的代码比较差,但是可以简单告诉大家如何通过 OutputWindowPanes 创建

这里拿到的 Pane 是 OutputWindowPane 和上面 IVsOutputWindowPane 是有点不一样的,通过 OutputWindowPane 可以拿到输出

       private void GetText(OutputWindowPane pane)
{
ThreadHelper.ThrowIfNotOnUIThread();
TextDocument document = pane.TextDocument;
EditPoint point = document.StartPoint.CreateEditPoint(); // 下面 str 就是输出
var str = point.GetText(document.EndPoint);
}

这里获取输出请看 VisualStudio 扩展开发 获得输出窗口内容

这个 CreatePane 方法全部代码

       private async void CreatePane(string title)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE));
OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes; try
{
// If the pane exists already, write to it.
OutputWindowPane pane = panes.Item(title);
}
catch (ArgumentException)
{
// Create a new pane and write to it.
var pane = panes.Add(title);
pane.OutputString("欢迎访问我博客 http://lindexi.gitee.io 里面有大量 UWP WPF 博客 \n");
}
}

在 Execute 方法使用下面代码

            CreatePane("林德熙是逗比");

运行可以看到下面代码

但是通过 OutputWindow 的方法获取不是很好,因为有多语言,可能在日本使用的调试窗口写的是デバッグ可能写的插件只能在自己的语言使用,所以还是建议使用 GUID 的方法创建

获取 General 窗口

在 VisualStudio 有两个输出窗口是默认的,就是 General 和 Build 输出窗口

通过服务的方式可以拿到 General 窗口

        private async Task GetGeneralPane()
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
var pane = (IVsOutputWindowPane) await package.GetServiceAsync(
typeof(SVsGeneralOutputWindowPane));
}

获取 Build 窗口

通过下面可以获取 Build 窗口

IDE GUIDs 找到 Build 窗口的 id 然后通过 id 找到窗口

现在就不使用上面的通过 Name 的方法找到窗口

           await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE));
OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes; foreach (EnvDTE.OutputWindowPane pane in panes)
{
if (pane.Guid == "{" +
"1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}")
{
}
}

这样就可以拿到 Build 窗口,尝试在这个窗口输出 编译失败 让你的小伙伴安装了插件就无法编译成功,虽然实际小伙伴还是可以运行代码

微软官方的文档有很多错误,看这篇Extending the Output Window文档不如看本文

Extending the Output Window

2019-2-3-VisualStudio-扩展开发-添加输出窗口的更多相关文章

  1. VisualStudio 扩展开发 获得输出窗口内容

    本文告诉大家如何拿到 VisualStudio 输出窗口的内容 在上一篇告诉大家如何开发添加菜单 点击的时候可以使用方法,如果需要拿到 VisualStudio 的输出窗口的内容,如想要开发一个插件, ...

  2. VisualStudio 扩展开发

    本文主要:如何开发一个 visual Studio 扩展,其实扩展也叫插件. 那么就是如何开发一个 vs插件. 我写这博客时候,是我在开发一个插件:编码规范工具.记录的是我从不知道到发布插件,如果遇到 ...

  3. 2019-3-1-VisualStudio-扩展开发-获得输出窗口内容

    title author date CreateTime categories VisualStudio 扩展开发 获得输出窗口内容 lindexi 2019-03-01 09:21:41 +0800 ...

  4. 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建

    目录 0.引言 1.什么是Visual Studio项目模板 2.IWizad接口 3.通过Visual Studio扩展开发实现领域驱动开发 3.1 使用VSIX+ProjectTemplate创建 ...

  5. PHP扩展开发相关总结

    1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...

  6. centos php扩展开发流程

    原文:centos php扩展开发流程 一.安装php centos 默认 yum 安装 php 版本为 5.3, 很多php框架基本上要求5.4以上版本,这时候不能直接 用 yum install ...

  7. PHP扩展开发-简单类扩展

    今天来学习简单类扩展开发 实现目标为如下php的类 <?php class classext(){ private $username; CONST URL="http://www.g ...

  8. PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...

  9. php扩展开发环境搭建

    首先要安装编译php时要的几个扩展库 (1)libxml2,若无php安装一些解析xml的扩展时会提示xml2-config not found sudo apt-get install libxml ...

随机推荐

  1. iview中table的render()函数

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---门面模式之HomeTheater[转]

      1unit uSubObject;   2   3interface   4   5type   6   7  { TAmplifier与TTuner,TCDPlayer,TDVDPlayer相互 ...

  3. Django+小程序技术打造微信小程序助手

    Django+小程序技术打造微信小程序助手   整个课程都看完了,当前这个课程的分享可以往下看,下面有某盘的链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,同时也分享下自己的总结 ...

  4. 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...

  5. Leetcode78. Subsets子集

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   [2 ...

  6. LintCode 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3 ...

  7. 一些windows server的操作

    windows server2008R2的一些操作和arcgis9.3 服务和arcgis9.3安装 1.在虚拟机中安装: https://jingyan.baidu.com/article/0eb4 ...

  8. prestashop 首页轮播幻灯片图片修改

    后台 -> Modules -> Modules 搜索 home(中文则搜幻灯片)

  9. 跨域知识(二)——JSONP

    JSONP是服务器与客户端跨源通信的常用方法.最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小. 它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据, ...

  10. Python比较有用的小语法

    额,这是在Codeforces做题的时候从Virtual judge那儿学的 #ord()内置函数,将单个字符变为int#chr()内置函数,将int变为单个字符# for : else ( 或 wh ...