次の方法で共有


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

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

コマンドの解決順序

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

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

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

  3. コンテキスト メニュー コマンド: コンテキスト メニューに配置されたコマンドは、まずはコンテキスト メニューに用意されているコマンド ターゲット、その後は通常のルーティングに提供されます。

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

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

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

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

    CutCopyPasteDeleteRenameEnterDoubleClickの各コマンドでは、特別な処理が必要です。 階層内の Delete および Remove コマンドを処理する方法の詳細については、IVsHierarchyDeleteHandler インターフェイスを参照してください。

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