다음을 통해 공유


바로 가기 메뉴 처리기 만들기

바로 가기 메뉴 처리기(상황에 맞는 메뉴 처리기 또는 동사 처리기라고도 함)는 파일 형식 처리기의 유형입니다. 이러한 처리기는 자체 프로세스 또는 탐색기 또는 다른 타사 프로세스에서 로드되도록 하는 방식으로 구현될 수 있습니다. 인프로세스 처리기를 만들 때 로드하는 프로세스에 해를 끼칠 수 있으므로 주의해야 합니다.

참고 항목

32비트 애플리케이션의 컨텍스트에서 작동하는 처리기를 등록할 때 Windows의 64비트 기반 버전에 대한 특별한 고려 사항이 있습니다. 다른 비트의 애플리케이션 컨텍스트에서 호출될 때 WOW64 하위 시스템은 파일 시스템 액세스를 일부 경로로 리디렉션합니다. .exe 처리기가 해당 경로 중 하나에 저장되면 이 컨텍스트에서 액세스할 수 없습니다. 따라서 해결 방법으로 리디렉션되지 않는 경로에 .exe 저장하거나 실제 버전을 시작하는 .exe 스텁 버전을 저장합니다.

이 항목은 다음과 같이 구성됩니다.

정식 동사

애플리케이션은 일반적으로 정의한 동사에 대해 지역화된 표시 문자열을 제공합니다. 그러나 언어 독립도를 제공하기 위해 시스템은 정식 동사라고 하는 일반적으로 사용되는 표준 동사 집합을 정의합니다. 정식 동사는 사용자에게 표시되지 않으며 모든 UI 언어와 함께 사용할 수 있습니다. 시스템은 정식 이름을 사용하여 제대로 지역화된 표시 문자열을 자동으로 생성합니다. 예를 들어 열려 있는 동사의 표시 문자열은 영어 시스템에서 열기로 설정되고 독일어 시스템에서는 독일어에 해당하는 문자열로 설정됩니다.

정식 동사 설명
시작 파일 또는 폴더를 엽니다.
Opennew 새 창에서 파일 또는 폴더를 엽니다.
인쇄 파일을 인쇄합니다.
Printto 사용자가 파일을 프린터 개체로 끌어서 인쇄할 수 있도록 허용합니다.
탐색 폴더가 선택된 Windows 탐색기를 엽니다.
속성 개체의 속성 시트를 엽니다.

참고 항목

Printto 동사도 정식이지만 표시되지 않습니다. 파일을 포함하면 파일을 프린터 개체로 끌어서 인쇄할 수 있습니다.

바로 가기 메뉴 처리기는 IContextMenu::GetCommandString을 통해 GCS_VERBW 또는 GCS_VERBA 통해 고유한 정식 동사를 제공할 수 있습니다. 시스템은 정식 동사를 ShellExecute에 전달된 두 번째 매개 변수(lpOperation)로 사용하고 CMINVOKECOMMANDINFO입니다. iContextMenu::InvokeCommand 메서드에 전달된 lpVerb 멤버입니다.

확장 동사

사용자가 개체를 마우스 오른쪽 단추로 클릭하면 바로 가기 메뉴에 기본 동사가 표시됩니다. 모든 바로 가기 메뉴에 표시되지 않는 일부 바로 가기 메뉴에서 명령을 추가하고 지원할 수 있습니다. 예를 들어 일반적으로 사용되지 않거나 숙련된 사용자를 위한 명령이 있을 수 있습니다. 이러한 이유로 하나 이상의 확장 동사를 정의할 수도 있습니다. 이러한 동사는 일반 동사와 비슷하지만 등록된 방식으로 일반 동사와 구별됩니다. 확장 동사에 액세스할 수 있도록 하려면 Shift 키를 누르는 동안 개체를 마우스 오른쪽 단추로 클릭해야 합니다. 사용자가 이 작업을 수행하면 기본 동사 외에 확장 동사가 표시됩니다.

레지스트리를 사용하여 하나 이상의 확장 동사를 정의할 수 있습니다. 연결된 명령은 Shift 키를 누르는 동안 사용자가 개체를 마우스 오른쪽 단추로 클릭할 때만 표시됩니다. 동사를 확장으로 정의하려면 동사의 하위 키에 "확장" REG_SZ 값을 추가합니다. 값에 연결된 데이터가 없어야 합니다.

프로그래밍 방식 액세스 전용 동사

이러한 동사는 상황에 맞는 메뉴에 표시되지 않습니다. ShellExecuteEx를 사용하고 pExecInfo 매개 변수의 lpVerb 필드(SHELLEXECUTEINFO 개체)를 지정하여 액세스할 수 있습니다. 동사를 프로그래밍 방식 액세스로만 정의하려면 동사의 하위 키에 "ProgrammaticAccessOnly" REG_SZ 값을 추가합니다. 값에 연결된 데이터가 없어야 합니다.

레지스트리를 사용하여 하나 이상의 확장 동사를 정의할 수 있습니다. 연결된 명령은 Shift 키를 누르는 동안 사용자가 개체를 마우스 오른쪽 단추로 클릭할 때만 표시됩니다. 동사를 확장으로 정의하려면 동사의 하위 키에 "확장" REG_SZ 값을 추가합니다. 값에 연결된 데이터가 없어야 합니다.

정적 동사를 사용하여 바로 가기 메뉴 사용자 지정

바로 가기 메뉴에 대한 정적 또는 동적 동사를 선택한 후 파일 형식에 대한 정적 동사를 등록하여 파일 형식의 바로 가기 메뉴를 확장할 수 있습니다. 이렇게 하려면 파일 형식과 연결된 애플리케이션의 ProgID에 대한 하위 키 아래에 셸 하위 키를 추가합니다. 필요에 따라 셸 하위 키의 기본값으로 만들어 파일 형식에 대한 기본 동사를 정의할 수 있습니다.

기본 동사는 바로 가기 메뉴에 먼저 표시됩니다. 그 목적은 ShellExecuteEx 함수가 호출될 때 사용할 수 있는 동사를 셸에 제공하는 것이지만 동사는 지정되지 않았습니다. ShellExecuteEx가 이 방식으로 사용되는 경우 셸이 반드시 기본 동사를 선택하지는 않습니다.

셸은 다음 순서대로 사용 가능한 첫 번째 동사를 사용합니다.

  1. 기본 동사
  2. 동사 순서가 지정된 경우 레지스트리의 첫 번째 동사입니다.
  3. Open 동사
  4. 동사를 사용하여 열기

나열된 동사를 사용할 수 없는 경우 작업이 실패합니다.

셸 하위 키 아래에 추가하려는 각 동사에 대해 하나의 하위 키를 만듭니다. 이러한 각 하위 키에는 동사의 표시 문자열(지역화된 문자열)로 설정된 REG_SZ 값이 있어야 합니다. 각 동사 하위 키에 대해 기본값이 항목 활성화를 위해 명령줄로 설정된 명령 하위 키를 만듭니다. 열기 및 인쇄같은 정식 동사의 경우 시스템이 제대로 지역화된 문자열을 자동으로 표시하므로 표시 문자열을 생략할 수 있습니다. 비사용 동사의 경우 표시 문자열을 생략하면 동사 문자열이 표시됩니다.

다음 레지스트리 예제에서는 다음 사항에 유의하세요.

  • Doit은 정식 동사가 아니므로 D 키를 눌러 선택할 수 있는 표시 이름이 할당됩니다.
  • 바로 가기 메뉴에는 Printto 동사가 표시되지 않습니다. 그러나 레지스트리에 포함하면 사용자가 파일을 프린터 아이콘에 놓아 인쇄할 수 있습니다.
  • 각 동사에 대해 하나의 하위 키가 표시됩니다. %1 은(는) 파일 이름과 %2 프린터 이름을 나타냅니다.
HKEY_CLASSES_ROOT
   .myp-ms
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = My Program Application
      Shell
         (Default) = doit
         doit
            (Default) = &Do It
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         open
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1" "%2"

다음 다이어그램에서는 위의 레지스트리 항목에 따라 바로 가기 메뉴의 확장을 보여 줍니다. 이 바로 가기 메뉴에는 [열기], [실행][인쇄] 동사가 기본 동사로 표시됩니다.

기본 동사 바로 가기 메뉴의 스크린샷

IDropTarget 인터페이스를 사용하여 처리기 활성화

DDE(동적 데이터 교환)는 더 이상 사용되지 않습니다. 대신 IDropTarget을 사용합니다. IDropTarget 은 더 강력하며 처리기의 COM 활성화를 사용하기 때문에 더 나은 활성화 지원을 제공합니다. 여러 항목을 선택하는 경우 IDropTarget에는 DDE 및 CreateProcess 모두에서 찾은 버퍼 크기 제한이 적용되지 않습니다. 또한 항목은 SHCreateShellItemArrayFromDataObject 함수를 사용하여 항목 배열로 변환할 수 있는 데이터 개체로 애플리케이션에 전달됩니다. 이렇게 하면 더 간단하며 항목이 명령줄 또는 DDE 프로토콜의 경로로 변환될 때 발생하는 네임스페이스 정보가 손실되지 않습니다.

파일 연결 특성에 대한 IDropTarget 및 Shell 쿼리에 대한 자세한 내용은 인식된 형식 및 애플리케이션 등록을 참조하세요.

정적 동사의 위치 및 순서 지정

일반적으로 동사는 열거 방법에 따라 바로 가기 메뉴에서 정렬됩니다. 열거형은 먼저 연결 배열의 순서를 기반으로 한 다음, 레지스트리의 정렬 순서에 정의된 대로 연결 배열의 항목 순서에 따라 달라집니다.

연결 항목에 대한 Shell 하위 키의 기본값을 지정하여 동사를 정렬할 수 있습니다. 이 기본값에는 바로 가기 메뉴의 위쪽 위치에 표시되는 단일 항목 또는 공백이나 쉼표로 구분된 항목 목록이 포함될 수 있습니다. 후자의 경우 목록의 첫 번째 항목은 기본 항목이며 다른 동사는 지정된 순서대로 바로 아래에 표시됩니다.

예를 들어 다음 레지스트리 항목은 다음 순서대로 바로 가기 메뉴 동사를 생성합니다.

  1. 표시
  2. 가제트
  3. Personalization
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

마찬가지로 다음 레지스트리 항목은 다음 순서대로 바로 가기 메뉴 동사를 생성합니다.

  1. Personalization
  2. 가제트
  3. 표시
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

메뉴의 위쪽 또는 아래쪽에 동사 배치

다음 레지스트리 특성을 사용하여 메뉴의 위쪽 또는 아래쪽에 동사를 배치할 수 있습니다. 이 특성을 지정하는 동사가 여러 개 있는 경우 마지막 동사가 우선 순위를 가져옵니다.

Position=Top | Bottom 

정적 계단식 메뉴 만들기

Windows 7 이상에서는 레지스트리 설정을 통해 연속 메뉴 구현이 지원됩니다. Windows 7 이전에는 IContextMenu 인터페이스의 구현을 통해서만 계단식 메뉴를 만들 수 있었습니다. Windows 7 이상에서는 정적 메서드가 부족한 경우에만 COM 코드 기반 솔루션에 의존해야 합니다.

다음 스크린샷은 계단식 메뉴의 예를 제공합니다.

계단식 메뉴의 예를 보여 주는 스크린샷

Windows 7 이상에서는 세 가지 방법으로 연속 메뉴를 만들 수 있습니다.

하위 명령 레지스트리 항목을 사용하여 계단식 메뉴 만들기

Windows 7 이상에서는 다음 절차를 사용하여 하위 명령 항목을 사용하여 계단식 메뉴를 만들 수 있습니다.

하위 명령 항목을 사용하여 계단식 메뉴를 만들려면

  1. HKEY_CLASSES_ROOT\ProgID\ 아래에 하위 키를 만들어 계단식 메뉴를 나타냅니다. 이 예제에서는 이 하위 키에 CascadeTest라는 이름을 지정합니다. CascadeTest 하위 키의 기본값이 비어 있고 값이 설정되지 않은 것으로 표시되는지 확인합니다.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. CascadeTest 하위 키에 REG_SZ 형식의 MUIVerb 항목을 추가하고 바로 가기 메뉴에 이름으로 표시할 텍스트를 할당합니다. 이 예제에서는 "Test Cascade Menu"를 할당합니다.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. CascadeTest 하위 키에 메뉴에 표시되어야 하는 동사의 목록이 세미콜론으로 구분된 REG_SZ 형식 의 SubCommands 항목을 모양 순서대로 추가합니다. 예를 들어 여기서는 시스템에서 제공하는 여러 동사를 할당합니다.

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. 사용자 지정 동사의 경우 정적 동사 구현 메서드를 사용하여 구현하고 가상 동사 VerbName에 대한 이 예제와 같이 CommandStore 하위 키 아래에 나열합니다.

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      CommandStore
                         Shell
                            VerbName
                            command
                               (Default) = notepad.exe %1
    

참고 항목

이 메서드는 사용자 지정 동사를 한 번 등록하고 SubCommands 항목 아래에 동사 이름을 나열하여 다시 사용할 수 있다는 장점이 있습니다. 그러나 애플리케이션에 HKEY_LOCAL_MACHINE 레지스트리를 수정할 수 있는 권한이 있어야 합니다.

 

ExtendedSubCommandsKey 레지스트리 항목을 사용하여 계단식 메뉴 만들기

Windows 7 이상에서는 ExtendedSubCommandKey 항목을 사용하여 계단식 메뉴 내의 계단식 메뉴와 같은 확장된 계단식 메뉴를 만들 수 있습니다.

다음 스크린샷은 확장된 계단식 메뉴의 예입니다.

디바이스에 대한 확장된 계단식 메뉴를 보여 주는 스크린샷

HKEY_CLASSES_ROOT HKEY_CURRENT_USER 및 HKEY_LOCAL_MACHINE 조합이므로 HKEY_CURRENT_USER 소프트웨어\클래스 하위 키 아래에\ 사용자 지정 동사를 등록할 수 있습니다. 이렇게 하면 주요 이점은 상승된 권한이 필요하지 않다는 것입니다. 또한 다른 파일 연결은 동일한 ExtendedSubCommandsKey 하위 키를 지정하여 이 전체 동사 집합을 다시 사용할 수 있습니다. 이 동사 집합을 다시 사용할 필요가 없는 경우 부모 아래에 동사를 나열할 수 있지만 부모의 기본값이 비어 있는지 확인할 수 있습니다.

ExtendedSubCommandsKey 항목을 사용하여 연계 메뉴를 만들려면

  1. HKEY_CLASSES_ROOT\ProgID\ 아래에 하위 키를 만들어 계단식 메뉴를 나타냅니다. 이 예제에서는 이 하위 키에 CascadeTest2라는 이름을 지정합니다. CascadeTest 하위 키의 기본값이 비어 있고 값이 설정되지 않은 것으로 표시되는지 확인합니다.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. CascadeTest 하위 키에 REG_SZ 형식의 MUIVerb 항목을 추가하고 바로 가기 메뉴에 이름으로 표시할 텍스트를 할당합니다. 이 예제에서는 "Test Cascade Menu"를 할당합니다.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. 만든 CascadeTest 하위 키 아래에 ExtendedSubCommandsKey 하위 키를 추가한 다음 문서 하위 명령(REG_SZ 형식)을 추가합니다. 예를 들면 다음과 같습니다.

    HKEY_CLASSES_ROOT
       txtfile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Layout
                   Properties
                   Select all
    

    Test Cascade Menu 2 하위 키의 기본값이 비어 있고 (값이 설정되지 않음) 표시되어 있는지 확인합니다.

  4. 다음 정적 동사 구현을 사용하여 하위 집합을 채웁니다. CommandFlags 하위 키는 EXPCMDFLAGS 값을 나타냅니다. 계단식 메뉴 항목 앞이나 뒤의 구분 기호를 추가하려면 ECF_SEPARATORBEFORE(0x20) 또는 ECF_SEPARATORAFTER(0x40)를 사용합니다. 이러한 Windows 7 이상 플래그에 대한 설명은 IExplorerCommand::GetFlags를 참조 하세요. ECF_SEPARATORBEFORE 최상위 메뉴 항목에 대해서만 작동합니다. MUIVerb은 REG_SZ 형식이며 CommandFlags는 REG_DWORD 형식입니다.

    HKEY_CLASSES_ROOT
       txtile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Shell
                      cmd1
                         MUIVerb = Notepad
                         command
                            (Default) = %SystemRoot%\system32\notepad.exe %1
                      cmd2
                         MUIVerb = Wordpad
                         CommandFlags = 0x20
                         command
                            (Default) = "C:\Program Files\Windows NT\Accessories\wordpad.exe" %1
    

다음 스크린샷은 이전 레지스트리 키 항목 예제의 그림입니다.

메모장 및 워드패드 선택 항목을 보여 주는 계단식 메뉴의 예를 보여 주는 스크린샷

IExplorerCommand 인터페이스를 사용하여 계단식 메뉴 만들기

연속 메뉴에 동사를 추가하는 또 다른 옵션은 IExplorerCommand::EnumSubCommands를 사용하는 것입니다. 이 메서드를 사용하면 IExplorerCommandProvider를 통해 명령 모듈 명령을 제공하는 데이터 원본이 바로 가기 메뉴에서 해당 명령을 동사로 사용할 수 있습니다. Windows 7 이상에서는 IContextMenu와 마찬가지로 IExplorerCommand를 사용하여 동일한 동사 구현을 제공할 수 있습니다.

다음 두 스크린샷은 디바이스 폴더에서 계단식 메뉴를 사용하는 방법을 보여 줍니다.

디바이스 폴더의 계단식 메뉴 예제를 보여 주는 스크린샷

다음 스크린샷은 디바이스 폴더에 있는 계단식 메뉴의 또 다른 구현을 보여 줍니다 .

디바이스 폴더의 계단식 메뉴 예제를 보여 주는 스크린샷

참고 항목

IExplorerCommand는 In-Process 활성화만 지원하므로 명령과 바로 가기 메뉴 간에 구현을 공유해야 하는 셸 데이터 원본에서 사용하는 것이 좋습니다.

 

고급 쿼리 구문을 사용하여 정적 동사에 대한 동적 동작 가져오기

AQS(고급 쿼리 구문)는 동사가 인스턴스화되는 항목의 속성을 사용하여 평가되는 조건을 표현할 수 있습니다. 이 시스템은 빠른 속성에서만 작동합니다. IShellFolder2::GetDefaultColumnState에서 SHCOLSTATE_SLOW 반환하지 않음으로써 셸 데이터 원본이 빠르게 보고하는 속성입니다.

Windows 7 이상에서는 지역화된 빌드에서 문제를 방지하는 정식 값을 지원합니다. 이 Windows 7 향상된 기능을 활용하려면 지역화된 빌드에 다음 정식 구문이 필요합니다.

System.StructuredQueryType.Boolean#True

다음 예제 레지스트리 항목에서:

  • AppliesTo 값은 동사가 표시되는지 숨겨지는지 여부를 제어합니다.
  • DefaultAppliesTo 값은 기본값인 동사를 제어합니다.
  • HasLUAShield 값은 UAC(사용자 계정 컨트롤) 방패가 표시되는지 여부를 제어합니다.

이 예제 에서 DefaultAppliesTo 값은 파일 이름에 "exampleText1"이라는 단어가 있는 모든 파일에 대해 이 동사를 기본값으로 만듭니다. AppliesTo 값을 사용하면 이름에 "exampleText1"이 있는 모든 파일에 동사를 사용할 수 있습니다. HasLUAShield 값은 이름에 "exampleText2"가 있는 파일의 방패를 표시합니다.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            DefaultAppliesTo = System.ItemName:"exampleText1"
            HasLUAShield = System.ItemName:"exampleText2"
            AppliesTo = System.ItemName:"exampleText1"

명령 하위 키 및 값을 추가합니다.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            Command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Windows 7 레지스트리에서 다음 방법을 사용하는 bitlocker 동사의 예로 HKEY_CLASSES_ROOT\드라이브를 참조하세요.

  • AppliesTo = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

AQS에 대한 자세한 내용은 고급 쿼리 구문을 참조 하세요.

사용되지 않음: 동사와 동적 데이터 교환 명령 연결

DDE는 더 이상 사용되지 않습니다. 대신 IDropTarget을 사용합니다. DDE는 브로드캐스트 창 메시지를 사용하여 DDE 서버를 검색하므로 더 이상 사용되지 않습니다. DDE 서버가 중단되어 브로드캐스트 창 메시지가 중단되므로 다른 애플리케이션에 대한 DDE 대화가 중단됩니다. 단일 중단된 애플리케이션이 사용자의 환경 전체에서 후속 중단을 일으키는 것이 일반적입니다.

IDropTarget 메서드는 더 강력하며 처리기의 COM 활성화를 사용하기 때문에 더 나은 활성화 지원을 제공합니다. 여러 항목을 선택하는 경우 IDropTarget에는 DDE 및 CreateProcess 모두에서 찾은 버퍼 크기 제한이 적용되지 않습니다. 또한 항목은 SHCreateShellItemArrayFromDataObject 함수를 사용하여 항목 배열로 변환할 수 있는 데이터 개체로 애플리케이션에 전달됩니다. 이렇게 하면 더 간단하며 항목이 명령줄 또는 DDE 프로토콜의 경로로 변환될 때 발생하는 네임스페이스 정보가 손실되지 않습니다.

파일 연결 특성에 대한 IDropTarget 및 Shell 쿼리에 대한 자세한 내용은 인식된 형식 및 애플리케이션 등록을 참조하세요.

동사 구현 작업 완료

동사를 구현하기 위한 다음 작업은 정적 동사와 동적 동사 구현 모두와 관련이 있습니다. 동적 동사에 대한 자세한 내용은 동적 동사를 사용하여 바로 가기 메뉴 사용자 지정을 참조하세요.

미리 정의된 셸 개체에 대한 바로 가기 메뉴 사용자 지정

미리 정의된 많은 Shell 개체에는 사용자 지정할 수 있는 바로 가기 메뉴가 있습니다. 일반적인 파일 형식을 등록하는 것과 거의 동일한 방식으로 명령을 등록하지만 미리 정의된 개체의 이름을 파일 형식 이름으로 사용합니다.

미리 정의된 개체 목록은 셸 확장 처리기 만들기의 미리 정의된 셸 개체 섹션에 있습니다. 레지스트리에 동사를 추가하여 바로 가기 메뉴를 사용자 지정할 수 있는 미리 정의된 셸 개체는 테이블에 동사라는 단어가 표시됩니다.

새 하위 메뉴 확장

사용자가 Windows 탐색기에서 파일 메뉴를 열면 표시되는 명령 중 하나가 새로 만들기입니다. 이 명령을 선택하면 하위 메뉴가 표시됩니다. 기본적으로 하위 메뉴에는 사용자가 하위 폴더와 바로 가기를 만들 수 있는 폴더와 바로 가기라는 두 가지 명령이 포함되어 있습니다. 이 하위 메뉴는 모든 파일 형식에 대한 파일 만들기 명령을 포함하도록 확장할 수 있습니다.

파일 만들기 명령을 새 하위 메뉴에 추가하려면 애플리케이션의 파일에 연결된 파일 형식이 있어야 합니다. 파일 이름 아래에 ShellNew 하위 키를 포함합니다. 파일 메뉴의 명령을 선택하면 셸에서 파일 형식을 새 하위 메뉴에 추가합니다. 명령의 표시 문자열은 프로그램의 ProgID에 할당된 설명 문자열입니다.

파일 생성 방법을 지정하려면 하나 이상의 데이터 값을 ShellNew 하위 키에 할당합니다. 사용 가능한 값은 다음 표에 나와 있습니다.

ShellNew 하위 키 값 설명
명령 애플리케이션을 실행합니다. 이 REG_SZ 값은 실행할 애플리케이션의 경로를 지정합니다. 예를 들어 마법사를 시작하도록 설정할 수 있습니다.
데이터 지정된 데이터를 포함하는 파일을 만듭니다. 이 REG_BINARY 값은 파일의 데이터를 지정합니다. NullFile 또는 FileName을 지정하면 데이터가 무시됩니다.
FileName 지정된 파일의 복사본인 파일을 만듭니다. 이 REG_SZ 값은 복사할 파일의 정규화된 경로를 지정합니다.
NullFile 빈 파일을 만듭니다. NullFile 에 값이 할당되지 않았습니다. NullFile을 지정하면 DataFileName 레지스트리 값이 무시됩니다.

 

다음 레지스트리 키 예제 및 스크린샷은 .myp-ms 파일 형식에 대한 새 하위 메뉴에 대해 설명합니다. MyProgram 애플리케이션이라는 명령 이 있습니다.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
         NullFile

스크린샷은 새 하위 메뉴에 대해 보여 줍니다. 사용자가 새 하위 메뉴에서 MyProgram 애플리케이션 선택하면 셸은 New MyProgram Application.myp-ms라는 파일을 만들어 MyProgram.exe 전달합니다.

끌어서 놓기 처리기 만들기

끌어서 놓기 처리기를 구현하기 위한 기본 절차는 기존의 바로 가기 메뉴 처리기와 동일합니다. 그러나 바로 가기 메뉴 처리기는 일반적으로 처리기의 IShellExtInit::Initialize 메서드에 전달된 IDataObject 포인터만 사용하여 개체의 이름을 추출합니다. 끌어서 놓기 처리기는 끌어온 개체의 동작을 수정하는 보다 정교한 데이터 처리기를 구현할 수 있습니다.

사용자가 Shell 개체를 마우스 오른쪽 단추로 클릭하여 개체를 끌면 사용자가 개체를 삭제하려고 할 때 바로 가기 메뉴가 표시됩니다. 다음 스크린샷은 일반적인 끌어서 놓기 바로 가기 메뉴를 보여 줍니다.

끌어서 놓기 바로 가기 메뉴의 스크린샷

끌어서 놓기 처리기는 이 바로 가기 메뉴에 항목을 추가할 수 있는 바로 가기 메뉴 처리기입니다. 끌어서 놓기 처리기는 일반적으로 다음 하위 키 아래에 등록됩니다.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

끌어서 놓기 처리기의 이름이 지정된 DragDropHandlers 하위 키 아래에 하위 키를 추가하고 하위 키의 기본값을 CLSID(처리기 클래스 식별자) GUID의 문자열 형식으로 설정합니다. 다음 예제에서는 MyDD 끌어서 놓기 처리기를 사용하도록 설정합니다.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers
            MyDD
               (Default) = {MyDD CLSID GUID}

동사 표시 안 함 및 표시 유형 제어

Windows 정책 설정을 사용하여 동사 표시 유형을 제어할 수 있습니다. Verb의 레지스트리 하위 키에 SuppressionPolicy 값 또는 SuppressionPolicyEx GUID 값을 추가하여 정책 설정을 통해 동사를 표시하지 않을 수 있습니다. SuppressionPolicy 하위 키의 값을 정책 ID로 설정합니다. 정책을 켜면 동사와 연결된 바로 가기 메뉴 항목이 표시되지 않습니다. 가능한 정책 ID 값은 RESTRICTIONS 열거형을 참조하세요.

동사 선택 모델 사용

사용자가 단일 항목, 여러 항목 또는 항목에서 선택 항목을 선택할 수 있는 상황을 처리하려면 동사에 레지스트리 값을 설정해야 합니다. 동사에는 동사가 지원하는 이러한 세 가지 상황 각각에 대해 별도의 레지스트리 값이 필요합니다. 동사 선택 모델에 사용할 수 있는 값은 다음과 같습니다.

  • 모든 동사에 대해 MultiSelectModel 값을 지정합니다. MultiSelectModel 값을 지정하지 않으면 선택한 동사 구현 형식에서 유추됩니다. COM 기반 메서드(예: DropTarget 및 ExecuteCommand) 의 경우 Player 가 가정되고 다른 메서드 에 대해서는 Document 가 가정됩니다.
  • 단일 선택만 지원하는 동사에 대해 Single을 지정합니다.
  • 임의의 수의 항목을 지원하는 동사에 대해 Player를 지정합니다.
  • 각 항목에 대해 최상위 창을 만드는 동사에 대해 문서를 지정합니다. 이렇게 하면 활성화된 항목 수가 제한되며 사용자가 창을 너무 많이 열 경우 시스템 리소스가 부족하지 않도록 방지할 수 있습니다.

선택한 항목 수가 동사 선택 모델과 일치하지 않거나 다음 표에 설명된 기본 제한보다 크면 동사가 나타나지 않습니다.

동사 구현 유형 Document 플레이어
레거시 15개 항목 항목 100개
COM: 15개 항목 제한 없음

 

다음은 MultiSelectModel 값을 사용하는 레지스트리 항목의 예입니다.

HKEY_CLASSES_ROOT
   Folder
      shell
         open
             = MultiSelectModel = Document
HKEY_CLASSES_ROOT
   ProgID
      shell
         verb
             = MultiSelectModel = Single | Document | Player

항목 특성 사용

항목에 대한 셸 특성의 SFGAO 플래그 값을 테스트하여 동사를 사용하도록 설정하거나 사용하지 않도록 설정할지 여부를 확인할 수 있습니다.

이 특성 기능을 사용하려면 동사 아래에 다음 REG_DWORD 값을 추가합니다.

  • AttributeMask 값은 테스트할 마스크의 비트 값에 대한 SFGAO 값을 지정합니다.
  • AttributeValue 값은 테스트되는 비트의 SFGAO 값을 지정합니다.
  • ImpliedSelectionModel은 항목 동사에 대해 0을 지정하거나 배경 바로 가기 메뉴의 동사에 대해 0이 아닌 값을 지정합니다.

다음 예제 레지스트리 항목에서 AttributeMask는 SFGAO_READONLY(0x40000)로 설정됩니다.

HKEY_CLASSES_ROOT
   txtfile
      Shell
         test.verb2
            AttributeMask = 0x40000
            AttributeValue = 0x0
            ImpliedSelectionModel = 0x0
            command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Desktop.ini 통해 폴더에 대한 사용자 지정 동사 구현

Windows 7 이상에서는 Desktop.ini 통해 폴더에 동사를 추가할 수 있습니다. Desktop.ini 파일에 대한 자세한 내용은 Desktop.ini 사용하여 폴더를 사용자 지정하는 방법을 참조하세요.

참고 항목

Desktop.ini 파일은 사용자에게 표시되지 않도록 항상 시스템 + 숨김으로 표시되어야 합니다.

 

Desktop.ini 파일을 통해 폴더에 대한 사용자 지정 동사를 추가하려면 다음 단계를 수행합니다.

  1. 읽기 전용 또는 시스템으로 표시된 폴더를 만듭니다.

  2. [를 포함하는 Desktop.ini 파일을 만듭니다. ShellClassInfo] DirectoryClass=Folder ProgID.

  3. 레지스트리에서 CanUseForDirectory 값을 사용하여 HKEY_CLASSES_ROOT\Folder ProgID를 만듭니다. CanUseForDirectory 값은 Desktop.ini 통해 폴더에 대한 사용자 지정 동사 구현에 참여하지 않도록 설정된 ProgID의 오용을 방지합니다.

  4. 폴더ProgID 하위 키 아래에 동사를 추가합니다. 예를 들면 다음과 같습니다.

    HKEY_CLASSES_ROOT
       CustomFolderType
          Shell
             MyVerb
                command
                   (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
    

참고 항목

이러한 동사는 기본 동사일 수 있으며, 이 경우 폴더를 두 번 클릭하면 동사가 활성화됩니다.

 

바로 가기 메뉴 처리기 및 여러 선택 동사에 대한 모범 사례

바로 가기 메뉴에 대한 정적 또는 동적 동사 선택

동적 동사를 사용하여 바로 가기 메뉴 사용자 지정

바로 가기(상황에 맞는) 메뉴 및 바로 가기 메뉴 처리기

동사 및 파일 연결

바로 가기 메뉴 참조