Vsx开发中常见的一个需求就是需要在某个特定的菜单中添加项目。比如我需要在代码视图中右击时,在Snippetgroup中加入自己的菜单项(如下图所示)。
我们已经涉及了如何添加一个菜单。我觉得,在任何一处添加自己的菜单项难点有三:
- 如何确定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已经被定义好了,选定一个认为没有定义过的数字,然后用这个数字在此文件中搜索,如果没有匹配的项那么这个值你就可以使用了。很简单,不是么:)
写到这里,我们已经能够成功的添加开头指定的菜单项了。过程看起来繁琐,其实真正找起来也就很短的时间而已。这篇仅仅是我自己的经验,希望给你一些帮助!