명령 라우팅 알고리즘

Visual Studio에서 명령은 다양한 구성 요소에 의해 처리됩니다. 명령은 현재 선택을 기준으로 가장 안쪽 컨텍스트에서 가장 바깥쪽(전역이라고도 함) 컨텍스트로 라우팅됩니다. 자세한 내용은 명령 가용성을 참조하세요.

명령 확인 순서

명령은 다음 수준의 명령 컨텍스트를 통해 전달됩니다.

  1. 추가 기능: 환경은 먼저 존재하는 모든 추가 기능에 명령을 제공합니다.

  2. 우선 순위 명령: 이러한 명령은 IVsRegisterPriorityCommandTarget을 사용하여 등록됩니다. 이는 Visual Studio의 모든 명령에 대해 호출되며 등록된 순서대로 호출됩니다.

  3. 바로 가기 메뉴 명령: 바로 가기 메뉴에 있는 명령은 먼저 바로 가기는 메뉴에 제공된 명령 대상에 제공되고 그 후에는 일반적인 라우팅으로 제공됩니다.

  4. 도구 모음 집합 명령 대상: 이러한 명령 대상은 SetupToolbar2를 호출할 때 등록됩니다. pCmdTarget 매개 변수는 null이 될 수 있습니다. null이 아닌 경우 이 명령 대상은 설정 중인 도구 모음에 있는 모든 명령을 업데이트하는 데 사용됩니다. 셸이 도구 모음을 설정하는 경우 도구 모음의 명령에 대한 모든 업데이트가 포커스가 없는 경우에도 창 프레임을 통해 흐르도록 창 프레임을 pCmdTarget으로 전달합니다.

  5. 도구 창: 일반적으로 IVsWindowPane 인터페이스를 구현하는 도구 창은 도구 창이 활성 창일 때 Visual Studio에서 명령 대상을 가져올 수 있도록 IOleCommandTarget 인터페이스도 구현해야 합니다. 그러나 포커스가 있는 도구 창이 프로젝트 창인 경우 명령은 선택한 항목의 공통 부모인 IVsUIHierarchy 인터페이스로 라우팅됩니다. 이 선택 영역이 여러 프로젝트에 걸쳐 있는 경우 명령은 IVsSolution 계층 구조로 라우팅됩니다. IVsUIHierarchy 인터페이스에는 IOleCommandTarget 인터페이스의 해당 명령과 유사한 ExecCommand 메서드 및 QueryStatusCommand 메서드가 포함되어 있습니다.

  6. 문서 창: 명령에 .vsct 파일에 RouteToDocs 플래그가 설정된 경우 Visual Studio는 문서 보기 개체에서 IVsWindowPane 인터페이스의 인스턴스 또는 문서 개체의 인스턴스(일반적으로 IVsTextLines 인터페이스 또는 IVsTextBuffer 인터페이스)인 명령 대상을 찾습니다. 문서 보기 개체가 명령을 지원하지 않는 경우 Visual Studio는 반환되는 IOleCommandTarget 인터페이스로 명령을 라우팅합니다. (이는 문서 데이터 개체에 대한 선택적 인터페이스입니다.)

  7. 현재 계층 구조: 현재 계층 구조는 현재 문서 창을 소유하는 프로젝트 또는 솔루션 탐색기에서 선택한 계층 구조일 수 있습니다. Visual Studio는 현재 또는 활성 계층 구조에서 구현되는 IOleCommandTarget 인터페이스를 찾습니다. 계층 구조는 프로젝트 항목의 문서 창에 포커스가 있더라도 계층 구조가 활성 상태일 때마다 유효한 명령을 지원해야 합니다. 그러나 솔루션 탐색기에 포커스가 있는 경우에만 적용되는 명령은 IVsUIHierarchy 인터페이스 및 해당 QueryStatusCommand 메서드 및 ExecCommand 메서드를 사용하여 지원해야 합니다.

    잘라내기, 복사, 붙여넣기, 삭제, 이름 바꾸기, EnterDoubleClick 명령에는 특별한 처리가 필요합니다. 계층 구조에서 삭제제거 명령을 처리하는 방법에 대한 자세한 내용은 IVsHierarchyDeleteHandler 인터페이스를 참조하세요.

  8. 전역: 이전에 언급한 컨텍스트에서 명령을 처리하지 않은 경우 Visual Studio는 IOleCommandTarget 인터페이스를 구현하는 명령을 소유하는 VSPackage로 라우팅하려고 시도합니다. VSPackage가 아직 로드되지 않은 경우 Visual Studio에서 QueryStatus 메서드를 호출할 때 로드되지 않습니다. VSPackage는 Exec 메서드가 호출될 때만 로드됩니다.