Add-In 多半需要使用者介面。前文採用的主要方式是選單與自訂視窗。本文將介紹更多 UI 操作技巧:
VS 中有各式視窗:方案總管、工具箱、輸出視窗、文字編輯器……雖外觀各異,但在自動化物件模型(AOM)中卻有共通結構。
DTE2.Windows 集合實作 IEnumerable,可遍歷所有視窗:
foreach (Window win in _applicationObject.Windows) {
_applicationObject.ToolWindows.OutputWindow.ActivePane.OutputString(win.Caption + Environment.NewLine);
}
亦可用索引或標題取得特定視窗,但索引不固定、標題易變(如方案總管標題含專案數)。幸運的是,內建工具視窗擁有唯一 GUID,透過 EnvDTE.Constants 定義的常數即可穩定存取:
Window slnWin = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer);
slnWin.SetFocus();
這樣不僅方便,效能也優於索引/標題方式。
通用的 Window 介面功能有限,若需針對特定視窗操作,可用 Object 屬性取得專屬物件:
Window taskListWin = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindTaskList);
TaskList taskList = taskListWin.Object as TaskList;
MessageBox.Show(string.Format("You have {0} tasks.", taskList.TaskItems.Count));
同理適用於命令視窗、錯誤清單等。對最重要的工具視窗,AOM 提供更便捷的 API。
DTE.ToolWindows 直接暴露常用視窗,如輸出視窗:
OutputWindow outputWin = _applicationObject.ToolWindows.OutputWindow;
outputWin.OutputWindowPanes.Add("NEnhancer");
outputWin.OutputWindowPanes.Item("NEnhancer").OutputString("Hello!");

方案總管、伺服器總管、巨集總管等樹狀視窗,底層皆為 UIHierarchy、UIHierarchyItems、UIHierarchyItem 結構,前文操作方案總管時已接觸過。
內建工具視窗畢竟有限,若需專屬功能,可建立自訂 ToolWindow。支援 ActiveX 控制項與 .NET 使用者控制項,此處介紹後者。
場景:VS 內建命令對應大量熱鍵,難以全記。若能在 VS 內查詢快捷鍵清單將非常方便。核心 API 為 Windows2.CreateToolWindow2:
Window CreateToolWindow2(AddIn Addin, string Assembly, string Class,
string Caption, string GuidPosition, ref object ControlObject);
參數說明:
Addin:建立視窗的 Add-In 執行個體Assembly:包含使用者控制項的組件完整名稱或路徑Class:實作控制項的類別完整名稱Caption:新視窗標題GuidPosition:視窗唯一識別碼,用於在 Windows 集合中查找ControlObject:要承載的使用者控制項關鍵注意:呼叫 CreateToolWindow2 前,必須將使用者控制項移至 Add-In 組件中,或設定所有屬性使其對 COM 完全可見,否則控制項無法正確封送,方法將回傳 null。
object programmingObj = null;
string guidString = "{41F8DEA8-EB07-45b7-9B1D-EB969DC43EC5}";
Windows2 windows2 = _applicationObject.Windows as Windows2;
Assembly asm = Assembly.GetExecutingAssembly();
shortcutListWindow = windows2.CreateToolWindow2(_addInInstance, asm.Location,
"NEnhancer.ShortcutListControl", "Visual Studio Shortcut List",
guidString, ref programmingObj);
ShortcutListControl 為實作快捷鍵查詢功能的使用者控制項。VS 將其實例載入工具視窗,使視窗擁有控制項功能;同時 VS 對所有工具視窗一視同仁,自訂視窗也支援浮動、停靠等標準操作。
通常在 OnConnection 中建立,建議判斷 connectMode 為 ext_cm_AfterStartup 時才建立(此時 VS 主視窗已載入完成)。建立後在 檢視 選單新增項目顯示視窗,只需設定 Window.Visible = true。

圖中以標籤頁形式顯示,按分類列出快捷鍵與說明,資料來源為 dofactory。
ActiveX 控制項建立 ToolWindow 可參考《Working with Microsoft Visual Studio 2005》第 228 頁。
本文介紹 VS 工具視窗相關操作:存取操作內建視窗(方案總管、輸出視窗等),以及建立自訂工具視窗(示範快捷鍵查詢功能)。
出處:原文連結
程式碼下載:原始碼 | 可執行 Add-In(解壓後放入 [My Documents]\Visual Studio 2008\Addins)