如何在Visual Studio扩展中查找和修改现有菜单命令

时间:2016-01-16 21:21:57

标签: c# visual-studio-2015 vsix

我目前正在为Visual Studio编写插件/扩展程序,我希望能够找到现有的菜单命令并将其隐藏起来。具体来说,我想在上下文菜单中找到Rebuild命令并隐藏或禁用它们。看起来我可以访问命令ID:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid(v=vs.140).aspx

使用OleMenuCommandService有一个FindCommand,但它返回NULL。以下是我目前正在尝试的内容:

OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
    MenuCommand rebuildCommand = mcs.FindCommand(new CommandID(
        Microsoft.VisualStudio.VSConstants.UICONTEXT_SolutionHasSingleProject,
        (int)Microsoft.VisualStudio.VSConstants.VSStd97CmdID.RebuildCtx) );

    // rebuildCommand is NULL
}

有关此方法的任何想法吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,似乎无法使用FindCommand方法获取现有的Visual Studio命令。您可以在MSDN forum上看到更详细的信息。

另外,我认为在扩展程序中使某些现有的Visual Studio功能不可用并不是一个好主意。相反,您可以订阅CommandEvents.BeforeExecuteCommandEvents.AfterExecute事件。以下是如何做到这一点:

using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;

...

DTE2 ide = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2);
CommandEvents commandEvents = ide.Events.CommandEvents;
commandEvents.BeforeExecute += OnBeforeExecute;
commandEvents.AfterExecute += OnAfterExecute;

...

private void OnBeforeExecute(string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault)
{
    if (ID == (int)VSConstants.VSStd97CmdID.RebuildCtx)
    {
        // Do something
    }
}

private void OnAfterExecute(string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault)
{
    if (ID == (int)VSConstants.VSStd97CmdID.RebuildCtx)
    {
        // Do something
    }
}