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

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

ベスト プラクティス

静的動詞は、実装する最も簡単な動詞であり、豊富な機能を提供します。 静的動詞メソッドのいずれかを使用して動詞を実装することを強くお勧めします。

動詞実装のベスト プラクティス

次の一覧は、動詞の実装のベスト プラクティスを表しています。

  • 常にニーズを満たす最も単純な動詞メソッドを選択してください。
  • 可能であれば、静的動詞メソッドを使用します。
  • UI スレッドでリソースを大量に消費する操作や I/O を実行しないでください。 IShellExtInit::InitializeIContextMenu::QueryContextMenu はどちらも、実行する作業において非常に保守的である必要があります。 IContextMenu::InvokeCommand は別のプロセスで実行するか、呼び出し元をブロックしないように新しいスレッドを作成する必要があります。
  • 次のように、独立系ソフトウェア ベンダー (ISV) 名で動詞のプレフィックスを付けます ISVName.verb。 修飾されていない名前を使用すると、同じ動詞名を選択した複数の ISV と競合する可能性があります。
  • 常にアプリケーション固有の ProgID を使用します。 一部のアイテムの種類ではこのマッピングが使用されないため、ベンダー固有の名前が必要です。
  • 呼び出し元のメソッドを基準にして UI を配置しますが、呼び出し元スレッドでは実行しないでください。
  • IContextMenu::InvokeCommand メソッドに渡される正規動詞の戻り値S_OKを受け入れないでください。 これにより、実際の動詞実装のエラーが呼び出され、正規動詞のエラー コードが返されます。 正規動詞をサポートしていない場合は、0 以外の HIWORD(lpVerb) 値が検出されたときにエラーが返されます。
  • 動詞のホストとして rundll32.exe を使用しないようにします。
  • IContextMenu::QueryContextMenu を実装する場合は、ResultFromShort マクロを使用して HRESULT 値を使用してメニューに追加された動詞の数を必ず返してください。
  • 次のいずれかのレジストリ キー エントリに登録する場合は、注意を払い、意図しない可能性のある結果を減らすために、最も具体的な型にハンドラーを登録してください。
    • HKEY_CLASSES_ROOT\*
    • HKEY_CLASSES_ROOT\AllFileSystemObjects
    • HKEY_CLASSES_ROOT\Folder
    • HKEY_CLASSES_ROOT\Directory
  • MayChangeDefaultMenu キーは、ショートカット メニューで既定の動詞を変更する必要がある場合にのみ設定します。 ハンドラーで既定の動詞が変更されない場合は、このキーを設定しないでください。そうすると、システムによって DLL が不必要に読み込まれるためです。
  • IShellExtInit::Initialize で実行する作業を最小限に抑えます。 ショートカット メニュー ハンドラーの場合は、 IShellExtInit::Initialize に渡されたデータ オブジェクトをキャプチャし、 IContextMenu::QueryContextMenu または IContextMenu::InvokeCommand で処理します。

複数選択動詞のベスト プラクティス

複数選択動詞シナリオの項目数は大きくなる可能性があるため、動詞の実装のパフォーマンスへの影響を考慮することが重要です。 たとえば、ユーザーが多数のアイテムを含むスコープで "*" を検索し、[ すべて選択 ] をクリックして右クリックすると、動詞に何千もの項目を含めることができる選択範囲が表示されます。 その結果、動詞では、選択範囲の最初の項目とアイテムの合計数のみを考慮する必要があります。 最初の項目は、ビューの上部にある項目、またはユーザーが最初に右クリックした項目のいずれかとして定義されます。

Windows 7 以降では、ショートカット メニューのクエリが実行されると、動詞に渡される項目の数は 16 に制限されます。 動詞は、その動詞が呼び出されたときに、完全な選択で再作成され、再初期化されます。

場合によっては、少数の固定項目を考慮するのが適切です。 たとえば、"diff" 動詞では、最初の 2 つの項目のみを考慮するのが適切です。 一般に、選択範囲のすべての項目をテストして特定の種類であるかどうかを確認したり、選択範囲のすべての項目にプロパティを照会したりする必要はありません。 最初の項目を見て、動詞を追加するのが適切かどうかを判断します。

異種選択

オプティミスティック動詞は、疑いのない項目を動詞で処理できると仮定して、複数選択のケースで自動的に追加されます。 これに対し、ペシミスティック動詞は、選択に疑いのない項目が含まれている場合には追加されず、項目の数が少ない場合にのみ追加されます。

プレーヤー スタイルの動詞はオプティミスティックにし、処理されない項目をサイレントにスキップする必要があります。 項目に対して操作を行わないと、データの損失や混乱が発生する可能性がある場合、動詞は処理できない項目についてユーザーに警告する必要があります。 たとえば、"backup" 動詞は、一部の項目をバックアップできなかったことを示す必要があります。

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

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

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

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

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

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