ショートカット メニュー ハンドラーの作成

ショートカット メニュー ハンドラーは、コンテキスト メニュー ハンドラーまたは動詞ハンドラーとも呼ばれ、ファイル型ハンドラーの一種です。 これらのハンドラーは、独自のプロセスまたはエクスプローラー、または他のサード パーティのプロセスで読み込まれるように妨げになることがあります。 インプロセス ハンドラーは、読み込まれるプロセスに害を及ぼす可能性があるため、インプロセス ハンドラーを作成するときは注意してください。

注意

32 ビット アプリケーションのコンテキストで動作するハンドラーを登録する場合、64 ビット ベースのバージョンの Windows には特別な考慮事項があります。異なるビット性のアプリケーションのコンテキストで呼び出されると、WOW64 サブシステムはファイル システムのアクセスを一部のパスにリダイレクトします。 .exe ハンドラーがこれらのパスのいずれかに格納されている場合、このコンテキストではアクセスできません。 そのため、回避策として、リダイレクトされないパスに.exeを格納するか、実際のバージョンを起動する.exeのスタブ バージョンを格納します。

このトピックは次のように整理されています。

標準動詞

アプリケーションは一般に、定義する動詞にローカライズされた表示文字列を提供する役割を担います。 ただし、言語に依存しない度合いを提供するために、システムは正規動詞と呼ばれる一般的に使用される動詞の標準セットを定義します。 正規動詞はユーザーに表示されることはなく、任意の UI 言語で使用できます。 システムは正規名を使用して、適切にローカライズされた表示文字列を自動的に生成します。 たとえば、オープン動詞の表示文字列は、英語システムでは Open に設定され、ドイツ語システムではドイツ語に相当します。

標準動詞 説明
[ファイル] ファイルまたはフォルダーを開きます。
Opennew ファイルまたはフォルダーを新しいウィンドウで開きます。
印刷 ファイルを印刷します。
Printto ユーザーがファイルをプリンター オブジェクトにドラッグして印刷することを許可します。
探索 フォルダーが選択された状態で Windows エクスプローラーを開きます。
プロパティ オブジェクトのプロパティ シートを開きます。

注意

Printto 動詞も正規語ですが、表示されません。 そのインクルードにより、ユーザーはファイルをプリンター オブジェクトにドラッグして印刷できます。

ショートカット メニュー ハンドラーは、 IContextMenu::GetCommandString を使用して、 GCS_VERBWまたは GCS_VERBAを使用して独自の正規動詞を提供できます。 システムは、ShellExecute に渡される 2 番目のパラメーター (lpOperation) として正規動詞を使用し、CMINVOKECOMMANDINFO ですiContextMenu::InvokeCommand メソッドに渡される lpVerb メンバー。

拡張動詞

ユーザーがオブジェクトを右クリックすると、ショートカット メニューに既定の動詞が表示されます。 すべてのショートカット メニューに表示されない一部のショートカット メニューにコマンドを追加してサポートしたい場合があります。 たとえば、一般的に使用されていないコマンドや、経験豊富なユーザーを対象としたコマンドがあるとします。 このため、1 つ以上の拡張動詞を定義することもできます。 これらの動詞は通常の動詞に似ていますが、登録方法によって通常の動詞と区別されます。 拡張動詞にアクセスするには、Shift キーを押しながらオブジェクトを右クリックする必要があります。 ユーザーがそうすると、既定の動詞に加えて拡張動詞が表示されます。

レジストリを使用して、1 つ以上の拡張動詞を定義できます。 関連付けられたコマンドは、ユーザーがオブジェクトを右クリックし、Shift キーを押した場合にのみ表示されます。 動詞を拡張として定義するには、"extended" REG_SZ 値を動詞のサブキーに追加します。 値には、データが関連付けられていない必要があります。

プログラムによるアクセスのみ動詞

これらの動詞はコンテキスト メニューに表示されません。 これらにアクセスするには、ShellExecuteEx を使用し、pExecInfo パラメーター (SHELLEXECUTEINFO オブジェクト) の lpVerb フィールドを指定します。 動詞をプログラムによるアクセスとしてのみ定義するには、"ProgrammaticAccessOnly" REG_SZ 値を動詞のサブキーに追加します。 値には、データが関連付けられていない必要があります。

レジストリを使用して、1 つ以上の拡張動詞を定義できます。 関連付けられたコマンドは、ユーザーがオブジェクトを右クリックし、Shift キーを押した場合にのみ表示されます。 動詞を拡張として定義するには、"extended" REG_SZ 値を動詞のサブキーに追加します。 値には、データが関連付けられていない必要があります。

静的動詞を使用したショートカット メニューのカスタマイズ

ショートカット メニューに静的または動的動詞を選択した後、ファイルの種類に静的動詞を登録することで、ファイルの種類のショートカット メニューを拡張できます。 これを行うには、ファイルの種類に関連付けられているアプリケーションの ProgID のサブキーの下に シェル サブキーを追加します。 必要に応じて、 シェル サブキーの既定値にすることで、ファイルの種類の既定の動詞を定義できます。

既定の動詞は、最初にショートカット メニューに表示されます。 その目的は、 ShellExecuteEx 関数が呼び出されたときに使用できる動詞をシェルに提供することですが、動詞は指定されません。 ShellExecuteEx がこの方法で使用されている場合、シェルは必ずしも既定の動詞を選択するとは限りません。

シェルでは、使用可能な最初の動詞が次の順序で使用されます。

  1. 既定の動詞
  2. 動詞の順序が指定されている場合は、レジストリの最初の動詞
  3. Open 動詞
  4. Open With 動詞

一覧表示されている動詞が使用できない場合、操作は失敗します。

シェル サブキーの下に追加する動詞ごとに 1 つのサブキーを作成します。 これらの各サブキーには、動詞の表示文字列 (ローカライズされた文字列) に 設定されたREG_SZ 値が必要です。 動詞サブキーごとに、項目をアクティブ化するためのコマンド ラインに既定値が設定されたコマンド サブキーを作成します。 OpenPrint などの正規動詞の場合は、適切にローカライズされた文字列がシステムによって自動的に表示されるため、表示文字列を省略できます。 非カノニカル動詞の場合、表示文字列を省略すると、動詞文字列が表示されます。

次のレジストリ例では、次の点に注意してください。

  • Doit は正規動詞ではないので、D キーを押すことで選択できる表示名が割り当てられます。
  • Printto 動詞はショートカット メニューに表示されません。 ただし、レジストリに含めることにより、ユーザーはファイルをプリンター アイコンにドロップして印刷できます。
  • 動詞ごとに 1 つのサブキーが表示されます。 %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 クエリとシェル クエリの詳細については、「 認識される型とアプリケーションの登録」を参照してください。

静的動詞の位置と順序の指定

通常、動詞は列挙方法に基づいてショートカット メニューに並べ替えされます。列挙型は、最初に関連付け配列の順序に基づき、次にレジストリの並べ替え順序で定義されている関連付け配列内の項目の順序に基づきます。

関連付けエントリのシェル サブキーの既定値を指定することで、動詞を並べ替えることができます。 この既定値には、ショートカット メニューの上部に表示される 1 つの項目、またはスペースまたはコンマで区切られた項目の一覧を含めることができます。 後者の場合、リスト内の最初の項目は既定の項目であり、他の動詞は指定された順序でそのすぐ下に表示されます。

たとえば、次のレジストリ エントリでは、ショートカット メニュー動詞が次の順序で生成されます。

  1. 表示
  2. ガジェット
  3. パーソナル化
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

同様に、次のレジストリ エントリでは、ショートカット メニュー動詞が次の順序で生成されます。

  1. パーソナル化
  2. ガジェット
  3. 表示
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

メニューの上部または下部に動詞を配置する

次のレジストリ属性を使用して、メニューの上部または下部に動詞を配置できます。 この属性を指定する動詞が複数ある場合、最後に指定した動詞が優先順位を取得します。

Position=Top | Bottom 

静的カスケード メニューの作成

Windows 7 以降では、カスケード メニューの実装はレジストリ設定を通じてサポートされています。 Windows 7 より前では、カスケード メニューの作成は 、IContextMenu インターフェイスの実装によってのみ可能でした。 Windows 7 以降では、静的メソッドが不十分な場合にのみ、COM コードベースのソリューションに頼る必要があります。

次のスクリーン ショットは、カスケード メニューの例を示しています。

カスケード メニューの例を示すスクリーン ショット

Windows 7 以降では、カスケード メニューを作成する 3 つの方法があります。

SubCommands レジストリ エントリを使用したカスケード メニューの作成

Windows 7 以降では、次の手順を使用して、SubCommands エントリを使用してカスケード メニューを作成できます。

SubCommands エントリを使用してカスケード メニューを作成するには

  1. HKEY_CLASSES_ROOT ProgID\シェルの下\にサブキーを作成して、カスケード メニューを表します。 この例では、このサブキーに CascadeTest という名前を付けます。 CascadeTest サブキーの既定値が空で、(値が設定されていない) として表示されていることを確認します。

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. CascadeTest サブキーに、REG_SZ種類の MUIVerb エントリ追加し、ショートカット メニューにその名前として表示されるテキストを割り当てます。 この例では、"テスト カスケード メニュー" を割り当てます。

    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
    

注意

このメソッドには、カスタム動詞を 1 回登録し、SubCommands エントリの下に動詞名を一覧表示して再利用できるという利点があります。 ただし、アプリケーションには、 HKEY_LOCAL_MACHINEでレジストリを変更するアクセス許可が必要です。

 

ExtendedSubCommandsKey レジストリ エントリを使用したカスケード メニューの作成

Windows 7 以降では、ExtendedSubCommandKey エントリを使用して、カスケード メニュー (カスケード メニュー内のカスケード メニュー) を拡張して作成できます。

次のスクリーン ショットは、拡張カスケード メニューの例です。

デバイスの拡張カスケード メニューを示すスクリーン ショット

HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_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 エントリ追加し、ショートカット メニューにその名前として表示されるテキストを割り当てます。 この例では、"テスト カスケード メニュー" を割り当てます。

    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
    

    [テスト カスケード メニュー 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 インターフェイスを使用したカスケード メニューの作成

カスケード メニューに動詞を追加するもう 1 つのオプションは、 IExplorerCommand::EnumSubCommands を使用することです。 このメソッドを使用すると、 IExplorerCommandProvider を介してコマンド モジュール コマンドを提供するデータ ソースで、これらのコマンドをショートカット メニューの動詞として使用できます。 Windows 7 以降では、IContextMenu と同じ動詞実装を IExplorerCommand を使用して提供できます。

次の 2 つのスクリーン ショットは、[ デバイス ] フォルダー内のカスケード メニューの使用方法を示しています。

devices フォルダー内のカスケード メニューの例を示すスクリーンショット。

次のスクリーン ショットは、 Devices フォルダー内のカスケード メニューの別の実装を示しています。

devices フォルダー内のカスケード メニューの例を示すスクリーン ショット

注意

IExplorerCommand はインプロセス アクティブ化のみをサポートするため、コマンドとショートカット メニューの間で実装を共有する必要があるシェル データ ソースで使用することをお勧めします。

 

高度なクエリ構文を使用した静的動詞の動的動作の取得

高度なクエリ構文 (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"

Command サブキーと値を追加します。

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 会話がハングします。 1 つのスタック アプリケーションで、ユーザーエクスペリエンス全体で後続のハングが発生するのが一般的です。

IDropTarget メソッドは、ハンドラーの COM アクティブ化を使用するため、より堅牢でアクティブ化のサポートが優れています。 複数の項目を選択した場合、 IDropTarget は DDE と CreateProcess の両方で見られるバッファー サイズ制限の対象になりません。 また、項目は、 SHCreateShellItemArrayFromDataObject 関数を使用して項目配列に変換できるデータ オブジェクトとしてアプリケーションに渡されます。 これを行う方が簡単で、項目がコマンドラインまたは DDE プロトコルのパスに変換されるときに発生する名前空間情報は失われません。

ファイル関連付け属性の IDropTarget クエリとシェル クエリの詳細については、「 認識される型とアプリケーションの登録」を参照してください。

動詞実装タスクの完了

動詞を実装するための次のタスクは、静的動詞と動的動詞の実装の両方に関連します。 動的動詞の詳細については、「動的動詞 を使用したショートカット メニューのカスタマイズ」を参照してください。

定義済みのシェル オブジェクトのショートカット メニューのカスタマイズ

多くの定義済みのシェル オブジェクトには、カスタマイズできるショートカット メニューがあります。 コマンドは、一般的なファイルの種類を登録するのとほぼ同じ方法で登録しますが、定義済みのオブジェクトの名前をファイルの種類名として使用します。

定義済みオブジェクトの一覧は、「シェル拡張ハンドラーの作成」の「定義済みのシェル オブジェクト」セクションにあります。 レジストリに動詞を追加することでショートカット メニューをカスタマイズできる定義済みのシェル オブジェクトは、表の中で動詞という単語でマークされます。

新しいサブメニューの拡張

ユーザーが Windows エクスプローラーで [ファイル] メニューを開くと、表示されるコマンドの 1 つが [新規] になります。 このコマンドを選択すると、サブメニューが表示されます。 既定では、サブメニューには フォルダーショートカットという 2 つのコマンドが含まれており、ユーザーはサブフォルダーとショートカットを作成できます。 このサブメニューは、任意の種類のファイル作成コマンドを含むように拡張できます。

[ 新規 ] サブメニューにファイル作成コマンドを追加するには、アプリケーションのファイルの種類が関連付けられている必要があります。 ファイル名の下に ShellNew サブキーを含めます。 [ファイル] メニューの [新規] コマンドを選択すると、シェルによってファイルの種類が [新しい] サブメニューに追加されます。 コマンドの表示文字列は、プログラムの ProgID に割り当てられる説明文字列です。

ファイルの作成方法を指定するには、 ShellNew サブキーに 1 つ以上のデータ値を割り当てます。 使用可能な値を次の表に示します。

ShellNew サブキー値 説明
コマンド アプリケーションを実行します。 この REG_SZ 値は、実行するアプリケーションのパスを指定します。 たとえば、ウィザードを起動するように設定できます。
Data 指定したデータを含むファイルを作成します。 この REG_BINARY 値は、ファイルのデータを指定します。 NullFile または FileName が指定されている場合、データは無視されます。
FileName 指定したファイルのコピーであるファイルを作成します。 この REG_SZ 値は、コピーするファイルの完全修飾パスを指定します。
NullFile 空のファイルを作成します。 NullFile には値が割り当てされていません。 NullFile を指定した場合、Data レジストリ値と FileName レジストリ値は無視されます。

 

次のレジストリ キーの例とスクリーン ショットは、.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 ポインターのみを使用して、オブジェクトの名前を抽出します。 ドラッグ アンド ドロップ ハンドラーでは、より高度なデータ ハンドラーを実装して、ドラッグされたオブジェクトの動作を変更できます。

ユーザーがシェル オブジェクトを右クリックしてオブジェクトをドラッグすると、ユーザーがオブジェクトをドロップしようとしたときにショートカット メニューが表示されます。 次のスクリーン ショットは、一般的なドラッグ アンド ドロップ ショートカット メニューを示しています。

ドラッグ アンド ドロップ ショートカット メニューのスクリーン ショット

ドラッグ アンド ドロップ ハンドラーは、このショートカット メニューに項目を追加できるショートカット メニュー ハンドラーです。 ドラッグ アンド ドロップ ハンドラーは、通常、次のサブキーの下に登録されます。

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

ドラッグ アンド ドロップ ハンドラーの という名前の DragDropHandlers サブキーの下にサブキーを追加し、サブキーの既定値をハンドラーのクラス識別子 (CLSID) GUID の文字列形式に設定します。 次の例では、 MyDD ドラッグ アンド ドロップ ハンドラーを有効にします。

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

動詞の抑制と可視性の制御

Windows ポリシー設定を使用して、動詞の可視性を制御できます。 動詞は、ポリシー設定によって 抑制できます。そのためには、SuppressPolicy 値または SuppressPolicyEx GUID 値を動詞のレジストリ サブキーに追加します。 SuppressionPolicy サブキーの値をポリシー ID に設定します。 ポリシーが有効になっている場合、動詞とそれに関連付けられているショートカット メニューエントリは抑制されます。 使用可能なポリシー ID 値については、 RESTRICTIONS 列挙を参照してください。

動詞選択モデルの使用

ユーザーが 1 つの項目、複数の項目、または項目から選択できる状況を処理するには、動詞のレジストリ値を設定する必要があります。 動詞では、動詞がサポートするこれら 3 つの状況ごとに個別のレジストリ値が必要です。 動詞選択モデルに使用できる値は次のとおりです。

  • すべての動詞に MultiSelectModel 値を指定します。 MultiSelectModel 値が指定されていない場合は、選択した動詞実装の種類から推論されます。 COM ベースのメソッド (DropTarget や ExecuteCommand など) の場合は Player が想定され、他のメソッドの場合は Document が想定されます。
  • 1 つの選択のみをサポートする動詞には、Single を指定します。
  • 任意の数の項目をサポートする動詞に 対して Player を 指定します。
  • アイテムごとに最上位レベルのウィンドウを作成する動詞に 対して Document を指定します。 これにより、アクティブ化された項目の数が制限され、ユーザーがウィンドウを開きすぎた場合にシステム リソースが不足するのを回避できます。

選択した項目の数が動詞選択モデルと一致しない場合、または次の表に示す既定の制限を超える場合、動詞は表示されません。

動詞の実装の種類 ドキュメント プレーヤー
従来 15 項目 100 アイテム
COM (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 ファイルの詳細については、「 How to Customize Folders with 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. FolderProgID サブキーの下に動詞を追加します。次に例を示します。

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

注意

これらの動詞は既定の動詞にすることができます。この場合、フォルダーをダブルクリックすると動詞がアクティブになります。

 

ショートカット メニュー ハンドラーと複数選択動詞のベスト プラクティス

ショートカット メニューの静的または動的動詞の選択

動的動詞を使用したショートカット メニューのカスタマイズ

ショートカット (コンテキスト) メニューとショートカット メニュー ハンドラー

動詞とファイルの関連付け

ショートカット メニューリファレンス