ショートカット メニュー ハンドラーの作成
ショートカット メニュー ハンドラー (コンテキスト メニュー ハンドラーまたは動詞ハンドラーとも呼ばれます) は、ファイルの種類ハンドラーの一種です。 これらのハンドラーは、独自のプロセスまたはエクスプローラー、または他のサード パーティのプロセスで読み込まれるように実装できます。 インプロセス ハンドラーは、読み込むプロセスに悪影響を及ぼす可能性があるため、インプロセス ハンドラーを作成するときは注意してください。
Note
32 ビット アプリケーションのコンテキストで動作するハンドラーを登録する場合、64 ビット ベースのバージョンの Windows には特別な考慮事項があります。異なるビットのアプリケーションのコンテキストで呼び出されると、WOW64 サブシステムはファイル システムのアクセスを一部のパスにリダイレクトします。 .exe ハンドラーがこれらのパスのいずれかに格納されている場合、このコンテキストではアクセスできません。 したがって、回避策として、リダイレクトされないパスに .exe を格納するか、実際のバージョンを起動する .exe のスタブ バージョンを格納します。
このトピックは次のように構成されています。
正規動詞
通常、アプリケーションは、定義する動詞にローカライズされた表示文字列を提供する役割を担います。 ただし、言語に依存する程度を提供するために、システムは正規動詞と呼ばれる一般的に使用される動詞の標準セットを定義します。 正規動詞はユーザーに表示されることはなく、任意の UI 言語で使用できます。 システムは正規名を使用して、適切にローカライズされた表示文字列を自動的に生成します。 たとえば、オープン動詞の表示文字列は、英語システムでは Open に、ドイツ語システムではドイツ語に相当する文字列に設定されます。
正規動詞 | 説明 |
---|---|
始 | ファイルまたはフォルダーを開きます。 |
Opennew | ファイルまたはフォルダーを新しいウィンドウで開きます。 |
印刷 | ファイルを出力します。 |
Printto | ユーザーがファイルをプリンター オブジェクトにドラッグして印刷することを許可します。 |
探索 | フォルダーが選択された状態で Windows エクスプローラーを開きます。 |
プロパティ | オブジェクトのプロパティ シートを開きます。 |
Note
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 がこの方法で使用されている場合、シェルは必ずしも既定の動詞を選択するとは限りません。
シェルでは、最初に使用可能な動詞が次の順序で使用されます。
- 既定の動詞
- 動詞の順序が指定されている場合、レジストリの最初の動詞
- Open 動詞
- Open With 動詞
一覧表示されている動詞がいずれも使用できない場合、操作は失敗します。
シェル サブキーの下に追加する動詞ごとに 1 つのサブキーを作成します。 これらの各サブキーには 、動詞の表示文字列 (ローカライズされた文字列) にREG_SZ 値が設定されている必要があります。 動詞サブキーごとに、項目をアクティブ化するためのコマンド ラインに既定値が設定されたコマンド サブキーを作成します。 Open や Print などの正規動詞の場合は、適切にローカライズされた文字列がシステムによって自動的に表示されるため、表示文字列を省略できます。 非カノニカル動詞の場合、表示文字列を省略すると、動詞文字列が表示されます。
次のレジストリ例では、次の点に注意してください。
- 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 つの項目、またはスペースまたはコンマで区切られた項目の一覧を含めることができます。 後者の場合、リスト内の最初の項目が既定の項目であり、他の動詞は指定された順序でそのすぐ下に表示されます。
たとえば、次のレジストリ エントリでは、ショートカット メニューの動詞が次の順序で生成されます。
- ディスプレイ
- ガジェット
- パーソナル化
HKEY_CLASSES_ROOT
DesktopBackground
Shell
Display
Gadgets
Personalization
同様に、次のレジストリ エントリでは、ショートカット メニューの動詞が次の順序で生成されます。
- パーソナル化
- ガジェット
- ディスプレイ
HKEY_CLASSES_ROOT
DesktopBackground
Shell = "Personalization,Gadgets"
Display
メニューの上部または下部に動詞を配置する
次のレジストリ属性を使用して、メニューの上部または下部に動詞を配置できます。 この属性を指定する動詞が複数ある場合は、最後の動詞が優先されます。
Position=Top | Bottom
静的カスケード メニューの作成
Windows 7 以降では、カスケード メニューの実装はレジストリ設定を通じてサポートされています。 Windows 7 より前では、カスケード メニューの作成は、IContextMenu インターフェイスの実装によってのみ可能でした。 Windows 7 以降では、静的メソッドが不十分な場合にのみ、COM コード ベースのソリューションに頼る必要があります。
次のスクリーン ショットは、カスケード メニューの例を示しています。
Windows 7 以降では、カスケード メニューを作成する 3 つの方法があります。
- SubCommands レジストリ エントリを使用したカスケード メニューの作成
- ExtendedSubCommandsKey レジストリ エントリを使用してカスケード メニューを作成する
- IExplorerCommand インターフェイスを使用したカスケード メニューの作成
SubCommands レジストリ エントリを使用したカスケード メニューの作成
Windows 7 以降では、次の手順を使用して、SubCommands エントリを使用してカスケード メニューを作成できます。
SubCommands エントリを使用してカスケード メニューを作成するには
ProgID シェルの下HKEY_CLASSES_ROOT\サブキーを作成して、カスケード メニューを表します。\ この例では、このサブキーに CascadeTest という名前 を付けます。 CascadeTest サブキーの既定値が空で、(値が設定されていない) として表示されていることを確認します。
HKEY_CLASSES_ROOT * shell CascadeTest (Default)
CascadeTest サブキーに、REG_SZ種類の MUIVerb エントリを追加し、ショートカット メニューにその名前として表示されるテキストを割り当てます。 この例では、"テスト カスケード メニュー" を割り当てます。
HKEY_CLASSES_ROOT * shell CascadeTest (Default) MUIVerb = Test Cascade Menu
CascadeTest サブキーに、メニューに表示する動詞のセミコロンで区切られたリストREG_SZ型の SubCommands エントリを外観順に追加します。 たとえば、ここではシステムで提供される動詞の数を割り当てます。
HKEY_CLASSES_ROOT * Shell CascadeTest SubCommands Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
カスタム動詞の場合は、静的動詞実装メソッドのいずれかを使用してそれらを実装し、架空の動詞 VerbName のこの例に示すように CommandStore サブキーの下にそれらを一覧表示します。
HKEY_LOCAL_MACHINE Software Microsoft Windows CurrentVersion Explorer CommandStore Shell VerbName command (Default) = notepad.exe %1
Note
このメソッドには、SubCommands エントリの下に動詞名を一覧表示することで、カスタム動詞を 1 回登録して再利用できるという利点があります。 ただし、アプリケーションには、HKEY_LOCAL_MACHINEのレジストリを変更するアクセス許可が必要です。
ExtendedSubCommandsKey レジストリ エントリを使用してカスケード メニューを作成する
Windows 7 以降では、ExtendedSubCommandKey エントリを使用して、カスケード メニュー内のカスケード メニューという拡張カスケード メニューを作成できます。
次のスクリーン ショットは、拡張カスケード メニューの例です。
HKEY_CLASSES_ROOTはHKEY_CURRENT_USERとHKEY_LOCAL_MACHINEの組み合わせであるため、HKEY_CURRENT_USER\ソフトウェア\クラス サブキーの下に任意のカスタム動詞を登録できます。 その主な利点は、昇格されたアクセス許可が必要ないということです。 また、他のファイルの関連付けでは、同じ ExtendedSubCommandsKey サブキーを指定することで、この動詞のセット全体を再利用できます。 この動詞のセットを再利用する必要がない場合は、親の下に動詞を一覧表示できますが、親の既定値が空であることを確認します。
ExtendedSubCommandsKey エントリを使用してカスケード メニューを作成するには
ProgID シェルの下HKEY_CLASSES_ROOT\サブキーを作成して、カスケード メニューを表します。\ この例では、このサブキーに CascadeTest2 という名前 を付けます。 CascadeTest サブキーの既定値が空で、(値が設定されていない) として表示されていることを確認します。
HKEY_CLASSES_ROOT * shell CascadeTest2 (Default)
CascadeTest サブキーに、REG_SZ種類の MUIVerb エントリを追加し、ショートカット メニューにその名前として表示されるテキストを割り当てます。 この例では、"テスト カスケード メニュー" を割り当てます。
HKEY_CLASSES_ROOT * shell CascadeTest (Default) MUIVerb = Test Cascade Menu 2
作成した CascadeTest サブキーの下に ExtendedSubCommandsKey サブキーを追加し、ドキュメント サブコマンド (REG_SZ型) を追加します。次に例を示します。
HKEY_CLASSES_ROOT txtfile Shell Test Cascade Menu 2 (Default) ExtendedSubCommandsKey Layout Properties Select all
[テスト カスケード メニュー 2] サブキーの既定値が空で、(値が設定されていません) として表示されていることを確認します。
次の静的動詞の実装のいずれかを使用して、サブバーブを設定します。 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 フォルダー内のカスケード メニューの別の実装を示しています。
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 レジストリでは、次の方法を採用HKEY_CLASSES_ROOT\bitlocker 動詞の例としてドライブを参照してください。
- 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 クエリとシェル クエリの詳細については、「認識される型とアプリケーションの登録」を参照してください。
動詞実装タスクの完了
動詞を実装するための次のタスクは、静的動詞と動的動詞の両方の実装に関連します。 動的動詞の詳細については、「動的動詞を使用したショートカット メニューのカスタマイズ」を参照してください。
定義済みのシェル オブジェクトのショートカット メニューのカスタマイズ
多くの定義済みのシェル オブジェクトには、カスタマイズできるショートカット メニューがあります。 一般的なファイルの種類を登録するのとほぼ同じ方法でコマンドを登録しますが、定義済みのオブジェクトの名前をファイルの種類名として使用します。
定義済みのオブジェクトの一覧は、「シェル拡張ハンドラーの作成」の「定義済みのシェル オブジェクト」セクションにあります。 レジストリに動詞を追加してショートカット メニューをカスタマイズできる、定義済みのシェル オブジェクトは、動詞という単語で表にマークされます。
新しいサブメニューの拡張
ユーザーがエクスプローラーで [ファイル] メニューを開くと、表示されるコマンドの 1 つが [新規] になります。 このコマンドを選択すると、サブメニューが表示されます。 既定では、サブメニューにはフォルダーとショートカットの 2 つのコマンドが含まれており、ユーザーはサブフォルダーとショートカットを作成できます。 このサブメニューは、任意のファイルの種類のファイル作成コマンドを含むように拡張できます。
[新規] サブメニューにファイル作成コマンドを追加するには、アプリケーションのファイルの種類が関連付けられている必要があります。 ファイル名の下に ShellNew サブキーを含めます。 [ファイル] メニューの [新しい] コマンドを選択すると、シェルはファイルの種類を [新しい] サブメニューに追加します。 コマンドの表示文字列は、プログラムの ProgID に割り当てられている説明文字列です。
ファイル作成方法を指定するには、ShellNew サブキーに 1 つ以上のデータ値を割り当てます。 使用可能な値を次の表に示します。
ShellNew サブキー値 | 説明 |
---|---|
コマンド | アプリケーションを実行します。 この REG_SZ 値は、実行するアプリケーションのパスを指定します。 たとえば、ウィザードを起動するように設定できます。 |
データ | 指定したデータを含むファイルを作成します。 この 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 ポリシー設定を使用して、動詞の可視性を制御できます。 動詞は、SuppressionPolicy 値または SuppressionPolicyEx GUID 値を動詞のレジストリ サブキーに追加することで、ポリシー設定によって抑制できます。 SuppressionPolicy サブキーの値をポリシー ID に設定します。 ポリシーが有効になっている場合、動詞とそれに関連付けられているショートカット メニューエントリは抑制されます。 使用可能なポリシー ID 値については、RESTRICTIONS 列挙型を参照してください。
動詞選択モデルの使用
ユーザーが 1 つの項目、複数の項目、または項目から選択できる状況を処理するには、動詞のレジストリ値を設定する必要があります。 動詞では、動詞がサポートするこれら 3 つの状況ごとに個別のレジストリ値が必要です。 動詞選択モデルで使用できる値は次のとおりです。
- すべての動詞に MultiSelectModel 値を指定します。 MultiSelectModel 値が指定されていない場合は、選択した動詞実装の種類から推論されます。 COM ベースのメソッド (DropTarget や ExecuteCommand など) の場合は Player が想定され、他のメソッド の場合は Document が想定されます。
- 1 つの選択のみをサポートする動詞に対して 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を使用してフォルダーをカスタマイズする方法」を参照してください。
Note
Desktop.iniファイルは、ユーザーに表示されないように、常にシステム + 非表示としてマークする必要があります。
Desktop.ini ファイルを使用してフォルダーのカスタム動詞を追加するには、次の手順に従います。
読み取り専用またはシステムとしてマークされているフォルダーを作成します。
を含むDesktop.ini ファイルを作成します。ShellClassInfo] DirectoryClass=Folder ProgID。
レジストリで、値が CanUseForDirectory HKEY_CLASSES_ROOT\Folder ProgID を作成します。 CanUseForDirectory 値は、Desktop.iniを介したフォルダーのカスタム動詞の実装に関与しないように設定されている ProgID の誤用を回避します。
フォルダーProgID サブキーの下に動詞を追加します。次に例を示します。
HKEY_CLASSES_ROOT CustomFolderType Shell MyVerb command (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
Note
これらの動詞は既定の動詞にすることができます。この場合、フォルダーをダブルクリックすると動詞がアクティブになります。
関連トピック