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

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

Note

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

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

標準動詞

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

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

Note

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

ショートカット メニュー ハンドラーは、 IContextMenu::GetCommandStringGCS_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 関数が呼び出されたときに使用できる動詞を Shell に提供することですが、動詞は指定されません。 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"

次の図は、上記のレジストリ エントリに従ったショートカット メニューの拡張機能を示しています。 このショートカット メニューには、既定の動詞として Do It を使用して、メニューに [開く]、[操作]、[印刷] の動詞があります。

screen shot of the do it default verb shortcut menu

IDropTarget インターフェイスを使用したハンドラーのアクティブ化

動的データ Exchange (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 コード ベースのソリューションに頼る必要があります。

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

screen shot showing an example of a cascading menu

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

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

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

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

  1. HKEY_CLASSES_ROOT\ProgIDshell\ の下にサブキーを作成して、カスケード メニューを表します。 この例では、このサブキーに 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
    

Note

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

 

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

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

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

screen shot showing extended cascading menu for devices

HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINEの組み合わせであるため、HKEY_CURRENT_USER\SoftwareClasses\ サブキーに任意のカスタム動詞登録できます。 これを行う主な利点は、管理者特権のアクセス許可が必要ないということです。 また、他のファイルの関連付けでは、同じ ExtendedSubCommandsKey サブキーを指定することで、この動詞のセット全体を再利用できます。 この動詞のセットを再利用する必要がない場合は、親の下に動詞を一覧表示できますが、親の既定値が空であることを確認します。

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

  1. HKEY_CLASSES_ROOT\ProgIDshell\ の下にサブキーを作成して、カスケード メニューを表します。 この例では、このサブキーに 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
    

次のスクリーン ショットは、前のレジストリ キーエントリの例の図です。

screen shot showing an example of a cascading menu showing choices of notepad and wordpad

IExplorerCommand インターフェイスを使用したカスケード メニューの作成

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

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

Screenshot that shows an example of a cascading menu in the devices folder.

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

screen shot showing an example of a cascading menu in the devices folder

Note

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\drive を参照してください。

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

AQS の詳細については、「 高度なクエリ構文」を参照してください。

非推奨: 動詞と動的データ Exchange コマンドの関連付け

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に渡されます

screen shot of windows explorer showing a new

ドラッグ アンド ドロップ ハンドラーの作成

ドラッグ アンド ドロップ ハンドラーを実装するための基本的な手順は、従来のショートカット メニュー ハンドラーの場合と同じです。 ただし、通常、ショートカット メニュー ハンドラーは、ハンドラーの IShellExtInit::Initialize メソッドに渡された IDataObject ポインターのみを使用して、オブジェクトの名前を抽出します。 ドラッグ アンド ドロップ ハンドラーでは、より高度なデータ ハンドラーを実装して、ドラッグされたオブジェクトの動作を変更できます。

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

screen shot of drag-and-drop shortcut menu

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

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 を指定します。
  • アイテムごとに最上位レベルのウィンドウを作成する動詞に ドキュメント を指定します。 これにより、アクティブ化される項目の数が制限され、ユーザーが開くウィンドウが多すぎる場合にシステム リソースの不足を回避するのに役立ちます。

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

動詞の実装の種類 ドキュメント プレーヤー
従来 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 ファイルの詳細については、「 Desktop.iniを使用してフォルダーをカスタマイズする方法」 を参照してください。

Note

Desktop.iniファイルは、ユーザーに表示されないように、常に SystemHidden + とマークする必要があります。

 

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
    

Note

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

 

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

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

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

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

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

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