我的新/其他的想法 - 這是與你相似:
你應該嘗試監視的窗口是最後激活。
如果您爲您的命令創建事件處理程序,那麼您可能能夠檢查當您的命令觸發時哪個窗口處於活動狀態。一個命令一個簡單的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來識別窗口(S)。你應該保持至少_cmdEvents
靜態,因爲當它被解析時,你的事件處理程序可能會消失(至少對於內部命令)。
在OnDisconnection中,您應該取消訂閱。
這並不適用於此:當我加入我的命令,它會自動出現在兩個地方,和AFAIK有沒有辦法告訴命令只出現在其中。這是有道理的 - 這些是VS顯示完全相同的項目的2個地方,所以與項目相關的命令應該出現在兩個地方。 – Jonathan 2013-12-24 09:05:24
如果添加菜單項類似解決方案的上下文菜單,它不知道你要在所有情況下使用它。例如,Tfs命令在簡單的解決方案中是不可見的。但是,如果你想在'UI'或你自己的程序中statets之間的不同,這似乎是它的正確方法。你應該用一個簡單的包來嘗試它,並獲得可用的'UI GIUID's。 – Ursegor 2013-12-26 09:04:50