Vsx开发中常见的一个需求就是需要在某个特定的菜单中添加项目。比如我需要在代码视图中右击时,在Snippetgroup中加入自己的菜单项(如下图所示)。
在vsx1中 我们已经涉及了如何添加一个菜单。我觉得,在任何一处添加自己的菜单项难点有三:
- 如何确定Button节点中的Guid (即下面第二幅图中的{1496A755-94DE-11D0-8C3F-00C04FC2AAE2}是如何得到的)
- 如何确保Button节点中的id属性没有被使用过 (即下面第二幅图中的 value="9999" 这个9999为什么这么设置,我怎么知道这个ID在这个group中没有被使用过呢?)
- 如何找到Button节点的Parent (即下面第一幅图中的Parent的guid和id怎么得到的)
下面我就按照我添加这个菜单项时候的寻找步骤来添加这个菜单项,仅供参考。
一. 快速找到某个菜单的Guid:Id
既然我们要在Insert Snippet的上面添加一个菜单项。那么比较好的方式就是看看Insert Snippet这个菜单项目在vsct中是怎么设置的。如果知道了Insert Snippet在vsct是怎么设置的,那么我们的工作就已经完成了一大半了。从这篇文章中我们可以知道如何利用一个注册文件来获得各个菜单项的具体Guid:Id信息。步骤如下:
- 将下面这段代码保存为“任意文件名.reg“ 的注册表文件吗,然后运行此注册表文件。注意代码中的"VisualStudio\10.0",如果你说用的是vs2008开发,那么请改为\9.0
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\General] "EnableVSIPLogging"=dword:00000001
2. 重启VS后,在想要查看的菜单项上按住shift+ctrl的同时,单击左键。如果配置正确,此时应该会弹出一个对话框(下图是在Insert Snippet上单击的结果)
可以看到我们已经能够获得Sinnpet菜单项的guid和cmdID了。到这边为止,我们提出的难点一已经解决。
二.根据Guid:Id得到默认配置信息
得到了Guid和CmdID之后,我们需要在C:\Program Files\Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Inc(具体的盘符取决于你安装的VS SDK位置)中搜索所有的文件,我的做法是全选里面的文件后右击选择使用Notepad++打开(一个编辑器)。
在所有打开的文件中所有我们找到的Guid ”1496A755-94DE-11D0-8C3F-00C04FC2AAE2“ ,此时文件定位到了一个叫stdidcmd.h的文件中(只有这一个文件匹配),在这个文件中我们再次搜索cmdID的值323,发现了这么一个匹配项(如下图所示)。果然就是我们要找的Snippet的菜单项。
有了ECMD_INSERTSNIPPET字符串以后,我们在所有文件中搜索这个字符串,结果如下:
注意其中的Line 2378:这个匹配项。我们进入这个匹配文件去看看具体的内容可以发现,我们已经找到了Snippet这个菜单项的parent是怎么设置的了。所以,第三个难点被解决。
接下来看看第二个难点,其实这个难点我们在查找323这个值的时候就可以顺便解决了。我的方法是找没有出现在323那个匹配文件中的数字。比如,我们找到的323这个匹配文件中还有许许多多的Id已经被定义好了,选定一个认为没有定义过的数字,然后用这个数字在此文件中搜索,如果没有匹配的项那么这个值你就可以使用了。很简单,不是么:)
写到这里,我们已经能够成功的添加开头指定的菜单项了。过程看起来繁琐,其实真正找起来也就很短的时间而已。这篇仅仅是我自己的经验,希望给你一些帮助!