2016-01-16 45 views
2

我目前正在爲Visual Studio編寫插件/擴展,我希望能夠找到現有的菜單命令並將其隱藏。具體來說,我想在上下文菜單中找到重建命令並隱藏或禁用它們。它看起來像我有權訪問命令ID:https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.vsstd2kcmdid(v=vs.140).aspx如何找到並修改Visual Studio擴展中的現有菜單命令

並使用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 
} 

任何想法的方式來做到這一點?

回答

0

不幸的是,使用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 
    } 
} 
+0

這很好,謝謝!我認爲即使我同意它不是理想的,我也可以完成這項工作 - 也許另一種方法是覆蓋全局Visual Studio設置來隱藏某些命令,就像您可以使用「工具」>「自定義」一樣進行操作。也許「正確」的問題是如何以編程方式更改設置? – jvaneenwyk

相關問題