Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 确定选择了哪个Visual Studio上下文菜单?_Visual Studio 2012_Add In - Fatal编程技术网

Visual studio 2012 确定选择了哪个Visual Studio上下文菜单?

Visual studio 2012 确定选择了哪个Visual Studio上下文菜单?,visual-studio-2012,add-in,Visual Studio 2012,Add In,我正在编写一个VS2012外接程序,为构建资源管理器上下文菜单添加一个命令(请参阅)。该命令将添加到两个不同的上下文菜单: 构建资源管理器 团队资源管理器,构建页面,我的构建部分 当调用我的一个回调时,我如何知道它是哪一个 我尝试获得焦点控件(按照建议使用p/Invoke)。但是,它为(1)提供了一个Tabs容器,为(2)提供了null。我可以尝试将控件强制转换为选项卡式容器,但这听起来很糟糕 有更好的选择吗?被评论修改,并建立了链接: 由于菜单项显示在每个地方,似乎无法将它们与外接程序区分开来

我正在编写一个VS2012外接程序,为构建资源管理器上下文菜单添加一个命令(请参阅)。该命令将添加到两个不同的上下文菜单:

  • 构建资源管理器
  • 团队资源管理器,构建页面,我的构建部分
  • 当调用我的一个回调时,我如何知道它是哪一个

    我尝试获得焦点控件(按照建议使用p/Invoke)。但是,它为(1)提供了一个Tabs容器,为(2)提供了null。我可以尝试将控件强制转换为选项卡式容器,但这听起来很糟糕


    有更好的选择吗?

    被评论修改,并建立了链接:

    由于菜单项显示在每个地方,似乎无法将它们与外接程序区分开来,因此您应该添加两个命令,并根据它们的上下文将它们区分开来

    与将外接程序转换为VS包不同,您还可以尝试从外接程序获取它

    但是:

    AddNamedCommand和QueryStatus方法都不支持 不可见状态:必须不可见的按钮。。。 保持禁用状态,而不是不可见

    我认为这使得以合适的方式从外接程序执行此操作变得不可能,但也许您可以检查上下文

    如果您尝试将命令/菜单迁移到VSPackage中,并为菜单项创建自定义
    UIContext
    ,或者找到合适的预定义菜单项,则可以通过其他方式获得更多信息。我无法访问使用Build Explorer增强的Studio,因此无法尝试

    以下讨论是关于vs包的自定义上下文:
    遗憾的是,这篇文章的链接断了,我看不到第一部分。第二部分。从一开始就是关于这个问题的讨论。 但不能保证你能创造出适合你的环境

    我为团队资源管理器找到的唯一上下文ID是
    guidTeamProjectCmdUIContext
    。 它位于VisualStudio2010SDK中的vsshilds.h,vsshell*.h还包含其他几个

    定义命令、菜单等。从软件包

    条件
    项目属性:

    用于命令和工具栏的元素

    VisibilityItem元素确定命令和工具栏的静态可见性。 ... 加载VSPackage后,Visual Studio希望命令可见性由VSPackage而不是VisibilityItem确定

    最后,关于预定义的上下文guid:


    我的新想法/其他想法-与你的想法类似:

    您应该尝试监视最后激活的窗口

    如果为命令创建eventhandler,则可以在命令触发时检查哪个窗口处于活动状态。命令的简单evenent处理程序:

    void cmdEvents_BeforeExecute( string guid, int ID, object customIn, object customOut, ref bool cancelDefault )
    {
      Window2 teamExplorer = _applicationObject.Windows.Item("Team Explorer") as Window2;
      if (_applicationObject.ActiveWindow.Caption == teamExplorer.Caption)
      {
           //You are called from Team Explorer
      }
      else
      {
           //Somewhere else
      }
    }
    
    以及您可以订阅的方式:

    static _dispCommandEvents_BeforeExecuteEventHandler _myHandler;
    static CommandEvents _cmdEvents;
    
    public void OnConnection(...)
    {
       Command command = ...; // Init your command 
       int ID = command.ID;
       string GUID = command.Guid;
    
       CommandEvents _cmdEvents = _applicationObject.Events.get_CommandEvents(GUID, ID);
    
       _myHandler = new _dispCommandEvents_BeforeExecuteEventHandler(cmdEvents_BeforeExecute);
    
       _cmdEvents.BeforeExecute += _myHandler;
    }
    
    您可能会找到一种更好的方法来通过GUID标识窗口。您应该至少将
    \u cmdEvents
    保持为静态,因为当它被取消批准时,您的事件处理程序可能会消失(至少对于内部命令)


    在OnDisconnection中,您应该取消订阅。

    这在这里不适用:当我添加命令时,它会自动出现在两个位置,而且恐怕无法告诉命令只出现在一个位置。这有点道理-VS在这两个位置显示完全相同的项目,因此与项目相关的命令应该出现在这两个位置。如果为类似上下文菜单的解决方案添加菜单项,则不确定是否要在所有情况下都使用它。例如,Tfs命令在简单解决方案上是不可见的。但是,如果您想区分
    UI
    的状态或您自己的程序,这似乎是正确的方法。您应该使用一个简单的包来尝试,并获得可用的
    UI-GIUID
    s。