vs2017 插件开发

环境

WIN10 VS2017 CMMT VSIX

参考资源:

vs菜单命令ID速查 https://docs.microsoft.com/zh-cn/visualstudio/extensibility/internals/guids-and-ids-of-visual-studio-menus

需要输出信息到窗口 https://docs.microsoft.com/zh-cn/visualstudio/extensibility/extending-the-output-window

命令快捷键 https://docs.microsoft.com/zh-cn/visualstudio/extensibility/binding-keyboard-shortcuts-to-menu-items

目标

文件发布,实现右击一个文件,复制到指定目录中.

建立VSIX项目,添加自定义命令项

 

.vsct

VSIX项目建好后,会有这个XML文件,记录自定义命令的相关属性,例如命令名字,图标,摆放位置

关键节点:

0.项目相关符号定义节

<GuidSymbol name="guidPublishFilePackage" value="{936ecd2c-2941-43e8-afff-71bd15417822}" />

项目建立后,有一个和项目名对应的CS文件,其中常量PackageGuidString值与此节的value值对应

1.符号定义节

<GuidSymbol name="guidPublishFilePackageCmdSetFILE" value="{14c506cb-99dc-4922-addf-3cefe8fbbc64}">
  <IDSymbol name="MyMenuGroupFile" value="0x0100" />
  <IDSymbol name="PublishFileId" value="0x0101" />
</GuidSymbol>

一个GuidSymbol节,会对应一个命令类.(每添加一个自定义命令时,就会增加一个命令类,并且此处会增加节点)

GuidSymbol节定义命令guid属性,name定义guid属性名,value定义其值,该值对应命令类的成员-常量值CommandSet

IDSymbol用于定义命令的id属性.有两个,一个用于命令,一个用于命令所在的命令组

Id属性名(name)和值(value).会用于Group Button KeyBinding节点的对应属性

其中,用于Button节点的value值,一定要对应命令类的成员-常量值CommandId,否则点击命令时无效

2.命令组节

<Groups>
  <Group guid="guidPublishFilePackageCmdSetFILE" id="MyMenuGroupFile" priority="0x0600">
  <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE" />
  </Group>

<Groups>

Group节表示一个命令组,它的guid属性值,就是来源于符号节 GuidSymbol 的name的值,id属性值来源于符号节IDSymbol第1个 的name的值.   如果有多个命令组,会有多个group节

其中节点Parent的id属性的值,表示该命令组所在的位置.也就是在VS中菜单位置.

Parent 命令ID  位置说明

IDM_VS_CTXT_FOLDERNODE     在文件夹上点右键
IDM_VS_CTXT_CODEWIN     代码文件,如.cs文件在编辑器中点右键
IDM_VS_CTXT_ITEMNODE     在项目中的文件上点右键
IDM_VS_CTXT_NOCOMMANDS     没有菜单
IDM_VS_CTXT_PROJNODE     在项目节点上点右键
IDM_VS_CTXT_SOLNNODE     在解决方案上点右键
 

3.命令节

<Buttons>

<Button guid="guidPublishFilePackageCmdSetFILE" id="PublishFileId" priority="0x0100" type="Button">
    <Parent guid="guidPublishFilePackageCmdSetFILE" id="MyMenuGroupFile" />
  <Strings>
    <ButtonText>发布文件</ButtonText>
    </Strings>
  </Button>

</Buttons>
Button表示一个命令,guid属性来源于Group节的guid值,id属性来源于GuidSymbol节的第二个子节点IDSymbol 的name属性.
Parent节表示命令所在的Group,其guid值和id值,来源于Group节的对应值.
 

4.快捷键节

<KeyBindings>
  <KeyBinding guid="guidPublishFilePackageCmdSetFILE" id="PublishFileId" mod1="CONTROL" mod2="CONTROL" key1="1" key2="1" editor="guidVSStd97" />
</KeyBindings>

设置命令的快捷键,guid,id属性值指明命令按钮.
mod1,mod2,key1,key1的值说明快捷键使用方式是 "按下ctrl键,然后再按1,再按一下1".
例如在VS中注释的快捷键是,CTRL+E+C.
 
添加自定义命令
 
在VSIX项目中添加新项,选Custom Command.
添加后,VSCT文件和项目包.cs文件会自动增加该命令的相关节点以及初始化方法.
命令执行逻辑代码写在该命令类的Execute方法中.
 
 
编译与安装
 
VSIX可以直接调试,点F5后,会打开一个模拟的VS,在这个VS中可以新建项目,文件.然后测试下自定义命令,可以断点调试.
项目编译后会得到一个.vsix文件.可以选择release版本的这个文件,然后双击安装,VS会关闭,再打开时,插件就能用了.
卸载插件和其它一样,点击 工具->扩展和更新 会看到这个插件,点击卸载.
 

VSIX 插件右键菜单的更多相关文章

  1. VSIX 插件右键菜单(2)

    编译项目然后发布 // 获取当前右击的活动项目 EnvDTE.Project activeProj = ProjectHelpers.GetActiveProject(); // 获取 编译选项 Re ...

  2. Jquery 右键菜单(ContextMenu)插件使用记录

    目前做的项目需要在页面里面用右键菜单,在网上找到两种jquery的右键菜单插件,但是都有各种问题.所以就自己动手把两种插件结合了下. 修改后的右键菜单插架可以根据绑定的触发页面元素不同,复用同一个菜单 ...

  3. 『练手』004 Laura.SqlForever如何扩展 导航栏 工具栏 右键菜单 插件

    004 Laura.SqlForever如何扩展 导航栏 工具栏 右键菜单 插件 导航栏 插件扩展 比如下图的    窗口 > 关闭所有文档    这个导航栏: 在 任何程序集,任何命名空间,任 ...

  4. vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单

    今天分享的不是技术,今天给大家分享个插件,针对现有的vue右键菜单插件,大多数都是需要使用插件本身自定义的标签,很多地方不方便,可扩展性也很低,所以我决定写了一款自定义指令调用右键菜单(vuerigh ...

  5. 几款jQuery右键菜单插件介绍

    在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单. 类似右键菜单的组件网上很多.一般而言,改变浏览器的默认菜单应当 ...

  6. IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件

    建立Installer安装类,如图: 代码如下: using Microsoft.Win32; using ResourceShare.UserClient.Common; using System; ...

  7. js(jquery)右键菜单插件的实现

    今天开发一个项目的时候需要一个模拟鼠标右键菜单的功能.也就是在网页点击鼠标右键的时候不是弹出系统的菜单而是我们制定的内容.这样可以拓展右键的功能.实现过程不多说了,写出来的代码和效果如下: js部分: ...

  8. 仿EXCEL插件,智表ZCELL产品V1.7 版本发布,增加自定义右键菜单功能

    详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,主要解决了自定义右键菜单事件的支持,并新增了公式中自定义函数传参.快捷键剪切等功能,欢迎大家体验使用. ...

  9. 为vscode开发一款svn右键菜单扩展

    在我平时的工作中会经常用到svn blame这个命令,但是vscode现有的svn扩展普遍都不能自定义右键菜单. 所以我产生一个想法:自己动手为vscode开发一款svn的扩展来定制右键菜单,本文记录 ...

随机推荐

  1. HDU 3947 Assign the task

    http://acm.hdu.edu.cn/showproblem.php?pid=3974 Problem Description There is a company that has N emp ...

  2. O(N) 求数组中最大子串和

    int MaxSubSum3(int *arr, int len) { int i; long long MaxSum = 0; long long CurSum = 0; for(int i = 0 ...

  3. 【转帖】Linux的历史----Linux内核剖析(一)

    Linux的历史----Linux内核剖析(一) 2015年04月09日 10:51:09 JeanCheng 阅读数:11351更多 所属专栏: Linux内核剖析    版权声明:本文为博主原创文 ...

  4. 47.Majority Element I & II

    Majority Element I 描述 给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. You may assume that the array is non ...

  5. Day 4-6 xml处理

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...

  6. API知识点总结

    一.开发api接口开放给其他人调用的api接口(短信接口,支付宝api) 二.api安全弱点数据窃取(解决加密),数据篡改(解决MD5),数据泄露(爬虫技术)(解决令牌)1.加密(HTTPS传输-收费 ...

  7. element-ui 源码解析 二

    Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...

  8. python之路--递归, 二分法

    一 . 递归 自己调用自己, 递归的入口(参数)  和  出口(return),  树形结构的遍历. def func(): print("我是递归") func() func() ...

  9. python学习笔记(8)--random库的使用

    伪随机数:采用梅森旋转算法生成的伪随机序列中元素 使用random库 一.基本随机函数 随机数需要一个种子,依据这个种子通过梅森旋转算法产生固定序列的随机数.seed(a=None)  初始化给定的随 ...

  10. Python2.7从入门到精通

    快速入门 1.程序输出print语句 (1)使用print语句可查看对象的值:在交互式解释器使用对象本身则输出此对象的字符串表示: (2)使用print语句调用str()显示对象:在交互式解释器使用对 ...