次の方法で共有


コマンド ルーティング アルゴリズム

Visual Studio では、コマンドはさまざまなコンポーネントによって処理されます。 コマンドは、現在の選択に基づく最も内側のコンテキストから、最も外側 (グローバルとも呼ばれます) コンテキストにルーティングされます。 詳細については、「 コマンドの可用性」を参照してください。

コマンド解決の順序

コマンドは、次のレベルのコマンド コンテキストを介して渡されます。

  1. アドイン: 環境はまず、存在するすべてのアドインにコマンドを提供します。

  2. 優先順位コマンド: これらのコマンドは、 IVsRegisterPriorityCommandTargetを使用して登録されます。 これらは Visual Studio のすべてのコマンドに対して呼び出され、登録された順序で呼び出されます。

  3. コンテキスト メニュー コマンド: コンテキスト メニューにあるコマンドは、最初にコンテキスト メニューに提供されるコマンド ターゲットに提供され、その後で一般的なルーティングに提供されます。

  4. ツール バー セットのコマンド ターゲット: これらのコマンド ターゲットは、 SetupToolbar2を呼び出すときに登録されます。 pCmdTarget パラメーターはnullできます。 nullされていない場合、このコマンド ターゲットは、設定しているツール バーにあるコマンドを更新するために使用されます。 シェルがツール バーを設定している場合は、ウィンドウ フレームが pCmdTarget として渡されるため、ツール バーのコマンドに対するすべての更新は、フォーカスがない場合でもウィンドウ フレームを通過します。

  5. ツール ウィンドウ: IVsWindowPane インターフェイスを通常実装するツール ウィンドウでは、ツール ウィンドウがアクティブ ウィンドウのときに Visual Studio がコマンド ターゲットを取得できるように、 IOleCommandTarget インターフェイスも実装する必要があります。 ただし、フォーカスがあるツール ウィンドウが [プロジェクト ] ウィンドウの場合、コマンドは、選択した項目の共通の親である IVsUIHierarchy インターフェイスにルーティングされます。 この選択が複数のプロジェクトにまたがる場合、コマンドは IVsSolution 階層にルーティングされます。 IVsUIHierarchy インターフェイスには、QueryStatusCommand インターフェイスの対応するコマンドに似たExecCommandメソッドとIOleCommandTarget メソッドが含まれています。

  6. ドキュメント ウィンドウ: コマンドの RouteToDocs ファイルに フラグが設定されている場合、Visual Studio はドキュメント ビュー オブジェクトのコマンド ターゲットを検索します。これは、IVsWindowPane インターフェイスのインスタンスまたはドキュメント オブジェクトのインスタンス (通常は、IVsTextLines インターフェイスまたはIVsTextBuffer インターフェイス) です。 ドキュメント ビュー オブジェクトがコマンドをサポートしていない場合、Visual Studio は、返される IOleCommandTarget インターフェイスにコマンドをルーティングします。 (これは、ドキュメントデータオブジェクト向けのオプションのインターフェースです)。

  7. 現在の階層: 現在の階層には、作業中のドキュメント ウィンドウを所有するプロジェクト、または ソリューション エクスプローラーで選択されている階層を指定できます。 Visual Studio は、現在の階層またはアクティブ階層に実装されている IOleCommandTarget インターフェイスを探します。 階層は、プロジェクト項目のドキュメント ウィンドウにフォーカスがある場合でも、階層がアクティブな場合に有効なコマンドをサポートする必要があります。 ただし、 ソリューション エクスプローラー にフォーカスがある場合にのみ適用されるコマンドは、 IVsUIHierarchy インターフェイスとその QueryStatusCommand メソッドと ExecCommand メソッドを使用してサポートする必要があります。

    [切り取り]、[コピー]、[貼り付け]、[削除]、[名前の変更]、[Enter]、[DoubleClick] の各コマンドには、特別な処理が必要です。 階層で Delete コマンドと Remove コマンドを処理する方法については、 IVsHierarchyDeleteHandler インターフェイスを参照してください。

  8. グローバル: 前述のコンテキストでコマンドが処理されていない場合、Visual Studio は、 IOleCommandTarget インターフェイスを実装するコマンドを所有する VSPackage にコマンドをルーティングしようとします。 VSPackage がまだ読み込まれていない場合は、Visual Studio が QueryStatus メソッドを呼び出したときに読み込まれません。 VSPackage は、 Exec メソッドが呼び出された場合にのみ読み込まれます。