Visual studio 2012 确定选择了哪个Visual Studio上下文菜单?
我正在编写一个VS2012外接程序,为构建资源管理器上下文菜单添加一个命令(请参阅)。该命令将添加到两个不同的上下文菜单:Visual studio 2012 确定选择了哪个Visual Studio上下文菜单?,visual-studio-2012,add-in,Visual Studio 2012,Add In,我正在编写一个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。