在 Visual Studio 中,命令是由許多不同的元件處理。 命令會從最內層內容 (以目前選取項目為基礎) 遞送至最外層 (也稱為全域) 內容。 如需詳細資訊,請參閱 命令可用性。
命令解析順序
命令會透過下列層級的命令內容傳遞:
增益集:環境會先將命令傳遞給所有可用的增益集。
優先順序命令:這些命令是使用 IVsRegisterPriorityCommandTarget註冊的。 Visual Studio 中的每個命令都會呼叫它們,並依照註冊順序呼叫它們。
操作功能表命令:位於操作功能表上的命令會先提供給提供給操作功能表的命令目標,然後提供給一般路由。
工具列設定命令目標:當您呼叫 SetupToolbar2時,會註冊這些命令目標。 參數可以是
pCmdTargetnull。 如果不是null,則此命令目標用於更新您正在設定的工具列上的任何命令。 如果殼層正在設定工具列,則會將視窗框架作為pCmdTarget傳遞,讓工具列上命令的所有更新都會流經視窗框架,即使它沒有焦點也一樣。工具視窗:通常實作 IVsWindowPane 介面的工具視窗也應該實作 IOleCommandTarget 介面,讓 Visual Studio 在工具視窗是作用中視窗時可以取得命令目標。 不過,如果具有焦點的工具視窗是 [專案 ] 視窗,則命令會路由傳送至 IVsUIHierarchy 所選項目的通用父系介面。 如果此選取項目跨越多個專案,則指令會遞送至 IVsSolution 階層。 介面包含IVsUIHierarchy和QueryStatusCommand 方法,這些方法類似於ExecCommand介面上的對應命令IOleCommandTarget。
文件視窗:如果命令在其
RouteToDocs檔案中設定旗標,Visual Studio 會在文件檢視物件上尋找命令目標,該物件是介面的IVsWindowPane實例或文件物件的實例 (通常是IVsTextLines介面或IVsTextBuffer介面) 。 如果文件檢視物件不支援命令,Visual Studio 會將命令路由至 IOleCommandTarget 所傳回的介面。 (這是文件資料物件的選用介面。目前階層:目前的階層可以是擁有作用中文件視窗的專案,也可以是方案 總管中選取的階層。 Visual Studio 會尋找在目前或活躍階層上實作的 IOleCommandTarget 介面。 階層應該支援每當階層處於作用中狀態時都有效的命令,即使專案專案的文件視窗具有焦點也一樣。 不過,必須使用介面及其IVsUIHierarchy和QueryStatusCommand方法來支援那些只有在方案總管具有焦點時才套用的命令。
「剪下」、「 複製」、「 貼上」、「 刪除」、「 重新命名」、「 Enter」和 「雙擊」 指令需要特殊處理。 如需如何在階層中處理 Delete 和 Remove 命令的相關資訊,請參閱介面 IVsHierarchyDeleteHandler 。
全域:如果先前提到的內容尚未處理命令,Visual Studio 會嘗試將它傳送到擁有實作 IOleCommandTarget 介面命令的 VSPackage。 如果尚未載入 VSPackage,則在 Visual Studio 呼叫 QueryStatus 方法時不會載入它。 只有在呼叫 Exec 方法時,才會載入 VSPackage。