路由傳送命令的演算法

在 Visual Studio 命令中,會由數個不同的元件處理。 命令會根據目前的選取範圍,從最內部的內容路由傳送至最外層 (也稱為全域) 內容。 如需詳細資訊,請參閱命令可用性

命令解析的順序

命令會透過下列命令內容層級傳遞:

  1. 增益集:環境會先將命令提供給任何存在的增益集。

  2. 優先順序命令:這些命令是使用 IVsRegisterPriorityCommandTarget 註冊的。 系統會針對 Visual Studio 中的每個命令呼叫它們,並依註冊的順序呼叫它們。

  3. 操作功能表命令:位於操作功能表上的命令會先提供給那些提供給操作功能表的命令目標,之後再提供給一般路由。

  4. 工具列集命令目標:當您呼叫 SetupToolbar2 時,會註冊這些命令目標。 pCmdTarget 參數可以是 null。 如果不是 null,則會使用此命令目標來更新您設定工具列上的任何命令。 如果 Shell 正在設定工具列,則會將視窗框架當作 pCmdTarget 傳遞,讓工具列上命令的所有更新都會流經視窗框架,即使它不在焦點中亦然。

  5. 工具視窗:通常實作 IVsWindowPane 介面的工具視窗也應該實作 IOleCommandTarget 介面,讓 Visual Studio 可以在工具視窗是作用中視窗時取得命令目標。 不過,如果具有焦點的工具視窗是 [專案] 視窗,則會將命令路由傳送至 IVsUIHierarchy 介面,而該介面是所選項目的通用上層。 如果此選取範圍跨越多個專案,則會將命令路由傳送至 IVsSolution 階層。 IVsUIHierarchy 介面包含 QueryStatusCommandIOleCommandTarget 介面上對應命令類似的ExecCommand 方法。

  6. 文件視窗:如過命令已在其 .vsct 檔案中設定 RouteToDocs 旗標,Visual Studio 會在文件檢視物件上尋找命令目標,該物件是 IVsWindowPane 介面執行個體或文件物件執行個體 (通常是 IVsTextLines 介面或 IVsTextBuffer 介面)。 如果文件檢視物件不支援命令,Visual Studio 會將命令路由傳送至傳回的 IOleCommandTarget 介面。 (這是文件資料物件的選用介面。)

  7. 目前階層:目前的階層可以是擁有作用中文件視窗的專案,或是解決方案總管中選取的階層。 Visual Studio 會尋找在目前或作用中階層上實作的 IOleCommandTarget 介面。 階層應該支援每當階層作用中時有效的命令,即使專案項目的文件視窗有焦點也一樣。 不過,必須使用 IVsUIHierarchy 介面及其 QueryStatusCommandExecCommand 方法來支援只有在 [解決方案總管] 具有焦點時才適用的命令。

    [剪下][複製][貼上][刪除][重新命名]Enter[按兩下] 命令需要特殊處理方式。 如需如何處理階層中 [刪除][移除] 命令的相關資訊,請參閱 IVsHierarchyDeleteHandler 介面。

  8. 全域:如果先前提及的內容尚未處理命令,Visual Studio 會嘗試將它路由至擁有實作 IOleCommandTarget 介面之命令的 VSPackage。 如果 VSPackage 尚未載入,則 Visual Studio 呼叫 QueryStatus 方法時不會載入。 只有在呼叫 Exec 方法時,才會載入 VSPackage。