VSIX:向Visual Studio编辑器上下文菜单添加菜单项

11

我有一个内部扩展程序,想要将其添加到Visual Studio中并连接到编辑器上下文菜单 - 无论打开的文件类型是什么。我可以动态处理启用/可见性,但基本上我希望它可以在任何类型的编辑器文件上都可以访问。

我一直没有找到正确的父命令/组ID,以便能够在编辑器上下文菜单上显示自定义按钮。我怀疑不止一个ID,而是多个ID,但我需要知道应该查看哪些内容。我很难弄清楚正确的父命令ID是什么,以便将其连接到编辑器上下文菜单。

具体来说,我需要能够向Visual Studio无法识别为HTML/Web文件的文件添加"在浏览器中查看"选项(即使它们已映射到适当的编辑器)。

相关问题:有没有合理的方法发现菜单命令和组名?在SharedCommandPlace.vsct中四处搜索是最接近实际菜单项的地方,但即使那样也很难与实际菜单项匹配。


1
不确定这是否适用于VS2013/2015和您的特定用例,但值得一试:http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-enablevsiplogging-to-identify-menus-and-commands-with-vs-2005-sp1.aspx .. 确保为相应的VS版本使用正确的注册表键。 - Jörg Battermann
看起来在VS2015中这个不起作用,但是在VS2013中可以。一旦我有了GUID和Cmd ID,我该如何将其映射到包所需的命令组定义? - Rick Strahl
Rick,自从上一次我玩过VS可扩展性的那个部分以来已经有一段时间了,但基本上编辑器上下文菜单通常会有一个通用的“父”GUID..据我所知,所有文件类型都有一个通用GUID,我只是不确定它是什么..它可能是这个:https://msdn.microsoft.com/zh-cn/library/microsoft.visualstudio.shell.vsmenus.idm_vs_ctxt_codewin(v=vs.140).aspx - Jörg Battermann
然而,这篇SO帖子提到了在vs中js / html / css文件的情况有所不同。https://dev59.com/8lDTa4cB1Zd3GeqPIVmc 。叹气。一旦你获得了这些父ID,插入自己的条目并连接自己的命令就可以在这里解释:https://msdn.microsoft.com/en-us/library/bb165739.aspx - Jörg Battermann
3个回答

18

我成功找到了上下文菜单的正确命令组。原来,各种编辑器都使用单独的上下文 ID,因此必须将它们作为单独的菜单进行管理,否则会变得混乱。

步骤

  1. 我使用了 HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0\General 键和 EnableVSIPLogging 值为 1,以启用日志记录。
  2. 然后,我在编辑器中导航,在空白区域上按下 CTRL-SHIFT 并右键单击鼠标。

这会给信息一个像 menu group 的菜单组,并且看起来像这样:

---------------------------
VSDebug Message
---------------------------
Menu data:
    Guid = {D7E8C5E1-BDB8-11D0-9C88-0000F8040A53}
    GuidID = 358
    CmdID = 53
    Type = 0x00000400
    Flags = 0x00000000
    NameLoc = ASPX Context
---------------------------
OK   
---------------------------

重要的值是GUID和CommandID。

Symbols下添加Guid和Command ID,如下所示,以注册命令集将Guid映射到CommandSet,将CommandId映射到上下文菜单值:

<GuidSymbol name="aspxContextCommandSet" value="{D7E8C5E1-BDB8-11D0-9C88-0000F8040A53}">
  <IDSymbol name="aspxContextMenu" value="0x0035"/>
</GuidSymbol>
请注意,该值映射到表示为十六进制值的CommandID。
然后,在“组”部分中引用此组作为您的命令组(MyMenuGroup)的父级组:
<Group guid="guidViewInBrowserPackageCmdSet" id="MyMenuGroup" priority="0x0000">
  <Parent guid="aspxContextCommandSet" id="aspxContextMenu"/>
</Group>

您引用您为命令按钮创建的菜单组,并指向在先前步骤中创建的上下文菜单。

如果您想对多个编辑器执行此操作(例如 ASPX、HTML 和 Code 编辑器,就像我一样),则必须为每个编辑器重复此过程,通过添加 GuidSymbol 和 Group。您将最终获得针对不同父项指向同一 MenuGroup 的多个 Group 条目,并且所有条目都会正确激活。

效果很好,但您可能需要使用 BeforeQueryStatus 事件处理程序过滤您的 OleMenuCommand 对象,以确保菜单仅在您实际可处理时才显示。


使用EnableVSIPLogging是一个非常好的想法。 - jwize

8

正是我所需要的,谢谢! - Daniel Lorenz

3
EnableVSIPLogging注册表值仍适用于VS 2015。您只需要在HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0\General下添加一个名为EnableVSIPLogging的DWORD,将其设置为1即可。
如果CTRL+SHIFT+菜单弹出或菜单选择没有导致该对话框,则该菜单项可能未实现为VSCT资源。
也就是说,您可能需要进行一些试验,因为编辑器和设计师不需要使用与代码编辑器相同的上下文菜单。
此外,您可能想尝试一下Mads的“Extensibility Tools”扩展,网址分别为https://visualstudiogallery.msdn.microsoft.com/ab39a092-1343-46e2-b0f1-6a3f91155aa6(2017)或https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ExtensibilityEssentials2019(2019)。
他添加了一个很有用的VSCT文件自动完成功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接