在解决方案资源管理器中将项添加到解决方案或项目节点的“添加”菜单

时间:2014-11-13 05:47:22

标签: .net visual-studio-extensions vsx vspackage vsct

右键单击visual studio解决方案资源管理器时,如何为“添加”菜单项添加子菜单?

我必须添加一个子菜单项,右键单击visual studio解决方案并移动到该菜单中的Add选项。

我正在尝试使用.vsct(vs package)。请帮助我提出宝贵的建议

1 个答案:

答案 0 :(得分:11)

当然,有类似的问题,但这似乎是一个特例......

通常,您需要知道要扩展的菜单命令和包ID。我通常通过在注册表中启用EnableVSIPLogging选项来执行此操作,如本文所述: http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-enablevsiplogging-to-identify-menus-and-commands-with-vs-2005-sp1.aspxEnableVSIPLogging选项是随Visual Studio 2005引入的,但仍适用于任何较新版本。

启用EnableVSIPLogging选项后,您可以通过单击菜单项(或与命令互连的任何其他UI元素)显示所需信息,同时按 Ctrl + 。这将显示一个包含包guid和命令/菜单ID的消息框; Ctrl + C 将显示的菜单或命令数据复制到剪贴板,顺便说一句。如果您对菜单数据感兴趣(如果是上下文菜单,请在悬停项目之前按 Ctrl + Shift )。

这就是我在机器上得到的......

---------------------------
VSDebug Message
---------------------------
Menu data:
Guid = {D309F791-903F-11D0-9EFC-00A0C911004F}
GuidID = 4
CmdID = 850
Type = 0x00000100
Flags = 0x00000000
NameLoc = A&dd
---------------------------
OK   
---------------------------

菜单信息可用于创作VSCT文件;这个问题可能符合你的兴趣:Using vsx how do you create a sub menu with commands?

在阅读其他问题的答案时,您可能想知道这些人是如何计算命令guids的名称的......这些名称是由vsshlids.h头文件定义的,该文件包含在Visual Studio SDK中。所以,对于上面显示的guid,我们发现......

// Guid for Shell's group and menu ids
DEFINE_GUID (guidSHLMainMenu,
    0xd309f791, 0x903f, 0x11d0, 0x9e, 0xfc, 0x00, 0xa0, 0xc9, 0x11, 0x00, 0x4f);

我们可以使用guidSHLMainMenu进行群组定义...

<Group guid="your-command-set" id="your-group-id">
    <Parent guid="guidSHLMainMenu" id="..." />
</Group>

我希望在IDM_VS_CTXT_中找到与命令ID匹配的vsshlids.h常量(或类似的东西),但是没有...而是找到了cmdidShellWindowNavigate7cmdidShellWindowNavigate5 stdidcmd.h中的常量;然后试了一下......

首先,我为两个命令组创建了新的id-symbols ...

<IDSymbol name="grpIdProjectContextAdd" value="0x1080" />
<IDSymbol name="grpIdSolutionContextAdd" value="0x1081" />

一个命令......

<IDSymbol name="cmdIdAddItemHelloWorld" value="0x1082" />

比我定义了新的组;并将获得的命令标识符用作父...

<Groups>
    <Group guid="your-command-set" id="grpIdProjectContextAdd">
        <Parent guid="guidSHLMainMenu" id="cmdidShellWindowNavigate7" />
    </Group>
    <Group guid="your-command-set" id="grpIdSolutionContextAdd">
        <Parent guid="guidSHLMainMenu" id="cmdidShellWindowNavigate5" />
    </Group>
</Groups>

当然,我需要一个按钮(默认位置放在项目的Add菜单中。)

<Commands>
    <Button guid="your-command-set" 
            id="cmdIdAddItemHelloWorld" priority="0x1100" type="Button">
        <Parent guid="your-command-set" id="grpIdProjectContextAdd" />
        <Strings>
            <ButtonText>Hello World</ButtonText>
        </Strings>
    </Button>
</Commands>

要使按钮也显示在解决方案节点的Add菜单中,我使用命令放置......

<CommandPlacements>
    <CommandPlacement guid="your-command-set" 
                      id="cmdIdAddItemHelloWorld" priority="0x1100">
        <Parent guid="your-command-set" id="grpIdSolutionContextAdd" />
    </CommandPlacement>
 </CommandPlacements>

对我来说,使用cmdidShellWindowNavigate7cmdidShellWindowNavigate5感觉有点不方便 常数,但结果我得到了这个......

enter image description here