如何在 Visual Studio 扩展中查找和修改现有菜单命令
How do you find and modify existing menu commands in Visual Studio extension
我目前正在为 Visual Studio 编写 plugin/extension,我希望能够找到现有的菜单命令并将其隐藏。具体来说,我想在上下文菜单中找到重建命令并隐藏或禁用它们。看起来我可以访问命令 ID:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid(v=vs.140).aspx
使用 OleMenuCommandService 有一个 FindCommand,但它 returns 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
}
关于执行此操作的任何想法?
不幸的是,似乎无法使用 FindCommand 方法获取现有的 Visual Studio 命令。您可以在MSDN forum.
上看到更详细的信息
此外,我认为让某些现有的 Visual Studio 功能在扩展程序中不可用并不是一个好主意。相反,您可以订阅 CommandEvents.BeforeExecute
和 CommandEvents.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
}
}
我目前正在为 Visual Studio 编写 plugin/extension,我希望能够找到现有的菜单命令并将其隐藏。具体来说,我想在上下文菜单中找到重建命令并隐藏或禁用它们。看起来我可以访问命令 ID:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid(v=vs.140).aspx
使用 OleMenuCommandService 有一个 FindCommand,但它 returns 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
}
关于执行此操作的任何想法?
不幸的是,似乎无法使用 FindCommand 方法获取现有的 Visual Studio 命令。您可以在MSDN forum.
上看到更详细的信息此外,我认为让某些现有的 Visual Studio 功能在扩展程序中不可用并不是一个好主意。相反,您可以订阅 CommandEvents.BeforeExecute
和 CommandEvents.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
}
}