ショートカット メニューの拡張

通常、オブジェクトを右クリックすると 、ショートカット メニューが表示されます。 このメニューには、ユーザーがオブジェクトに対してさまざまなアクションを実行するために選択できるコマンドの一覧が含まれています。 このセクションでは、ファイル システム オブジェクトのショートカット メニューの概要について説明します。

追加情報については、こちらを参照してください。

ファイル システム オブジェクトのショートカット メニュー

Windows エクスプローラーまたはデスクトップに表示されるファイルなどのオブジェクトをユーザーが右クリックすると、コマンドの一覧と共にショートカット メニューが表示されます。 その後、ユーザーは、適切なコマンドを選択して、ファイルを開く、削除するなど、ファイルに対してアクションを実行できます。

ショートカット メニューは多くの場合、ファイル管理に使用されるため、シェルには、任意のファイルのショートカット メニューに表示される一連の既定のコマンド (切り取りとコピーなど) が用意されています。 Open With は既定のコマンドですが、.wav などの一部の標準ファイルの種類では表示されないことに注意してください。 [ アイコンのカスタマイズ] の例としても使用されたサンプルの [マイ ドキュメント] ディレクトリの次の図は、MyDocs4.xyz を右クリックして表示された既定のショートカット メニューを示しています。

ファイル システム オブジェクトの既定のショートカット メニューのスクリーン ショット

MyDocs4.xyz に既定のショートカット メニューが表示される理由は、登録されている ファイルの種類のメンバーでないことです。 一方、.txtは登録済みのファイルの種類です。 .txtファイルの 1 つを右クリックすると、ショートカット メニューが表示され、上部セクションに [ 開く ] と [印刷] という 2 つのコマンドが追加 されます

ファイル システム オブジェクトのカスタマイズされたショートカット メニューのスクリーン ショット

ファイルの種類が登録されたら、そのショートカット メニューを追加のコマンドで拡張できます。 これらのファイルは、その種類のファイルが右クリックされると、既定のコマンドの上に表示されます。 この方法で追加されるコマンドのほとんどは、 印刷くなどの一般的なコマンドですが、ユーザーが役に立つ可能性のあるコマンドを自由に追加できます。

ファイルの種類のショートカット メニューを拡張するために必要なのは、各コマンドのレジストリ エントリを作成することです。 より高度な方法は、ファイルごとにファイルの種類のショートカット メニューを拡張できるショートカット メニュー ハンドラーを実装することです。 詳細については、「 コンテキスト メニュー ハンドラーの作成」を参照してください。

ショートカット メニューの動詞

ショートカット メニューの各コマンドは、その 動詞によってレジストリで識別されます。 これらの動詞は、アプリケーションをプログラムで起動するときに ShellExecuteEx で使用されるものと同じです。 ShellExecuteEx の使用の詳細については、「アプリケーションの起動」の説明を参照してください。

動詞は、関連付けられたコマンドを識別するためにシェルによって使用される単純なテキスト文字列です。 各動詞は、コンソール ウィンドウまたはバッチ (.bat) ファイルでコマンドを起動するために使用されるコマンド 文字列 に対応します。 たとえば、 開いている 動詞は通常、ファイルを開くプログラムを起動します。 通常、そのコマンド文字列は次のようになります。

"My Program.exe" "%1"

"%1" は、ファイル名で指定されたコマンド ライン パラメーターの標準プレースホルダーです。 たとえば、タブ付きビューに表示する特定のページを指定できます。

Note

コマンド文字列のいずれかの要素にスペースが含まれているか、スペースが含まれている可能性がある場合は、引用符で囲む必要があります。 それ以外の場合、要素にスペースが含まれている場合、正しく解析されません。 たとえば、"My Program.exe" はアプリケーションを正しく起動します。 My Program.exe を使用すると、システムは最初のコマンド ライン引数として "Program.exe" で "My" を起動しようとします。 文字列にスペースが含まれていないことを確実にすることはできませんので、シェルによって文字列に展開される "%1" などの引数には、常に引用符を使用する必要があります。

 

動詞には、動詞 文字列 自体の代わりにショートカット メニューに表示される表示文字列を関連付けることもできます。 たとえば、 openas の表示文字列は Open With です。 表示文字列にアンパサンド (&) を含む通常のメニュー文字列と同様に、コマンドをキーボードで選択できます。

標準動詞

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

正規動詞には次のものが含まれます。

説明
開く ファイルまたはフォルダーを開きます。
opennew ファイルまたはフォルダーを新しいウィンドウで開きます。
print ファイルを印刷します。
explore フォルダーが選択された状態で Windows エクスプローラーを開きます。
検索 フォルダーが既定の検索場所として設定されている [Windows 検索 ] ダイアログ ボックスを開きます。
openas [ ファイルを開く ] ダイアログ ボックスを開きます。
properties オブジェクトのプロパティ シートを開きます。

 

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

拡張動詞

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

ファイルの種類のショートカット メニューを拡張する

ファイルの種類のショートカット メニューを拡張する最も簡単な方法は、 レジストリです。 これを行うには、ファイルの種類に関連付けられているアプリケーションの ProgID のキーの下にシェル サブキーを追加します。 必要に応じて、シェル サブキーの既定値にすることで、ファイルの種類の既定の動詞を定義できます。

既定の動詞は、最初にショートカット メニューに表示されます。 その目的は、 ShellExecuteEx が呼び出されたときに使用できる動詞をシェルに提供することですが、動詞は指定されません。 ShellExecuteEx がこの方法で使用されている場合、シェルは必ずしも既定の動詞を選択するとは限りません。 Windows 2000 以降のシステムにあるシェル バージョン 5.0 以降の場合、シェルは次の一覧の最初の利用可能な動詞を使用します。 使用できない場合、操作は失敗します。

  • オープン動詞
  • 既定の動詞
  • レジストリの最初の動詞
  • openwith 動詞

バージョン 5.0 より前のシェル バージョンの場合は、3 番目の項目を省略します。

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

次の図は、[ファイルの種類] と [アイコンのカスタマイズ] で使用される .myp ファイルの種類 のショートカット メニュー を示しています。 ショートカット メニューに open、doit、printto の各動詞が表示され、既定の動詞として doit が使用されるようになりました。 ショートカット メニューは次のようになります。

カスタマイズしたショートカット メニューのスクリーン ショット

前の図に示したショートカット メニューを拡張するために使用されるレジストリ エントリは次のとおりです。

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            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" %3 %4

Open With コマンドは最初の区切り記号の上にありますが、システムによって自動的に作成され、レジストリ エントリは必要ありません。 標準動詞の表示名が自動的に作成され、開いて印刷されます。 doit は正規動詞ではないので、D キーを押すことで選択できる表示名 "&Do It" が割り当てられます。 printto 動詞はショートカット メニューには表示されませんが、含めると、ユーザーはプリンター アイコンにドロップしてファイルを印刷できます。 この例では、%1 はファイル名を表し、%2 はプリンター名を表します。

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

定義済みのシェル オブジェクトのショートカット メニューを拡張する

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

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

任意のファイルの種類を処理するアプリケーションの登録

このドキュメントの前のセクションでは、特定のファイルの種類のショートカット メニュー項目を定義する方法について説明しました。 特に、ショートカット メニューを定義すると、関連付けられているアプリケーションがファイルの種類のメンバーを開く方法を指定できます。 ただし、「 ファイルの種類」で説明したように、アプリケーションは、アプリケーションに関連付けられていないファイルの種類を開くためにユーザーがアプリケーションを使用しようとしたときに使用する別の既定のプロシージャを登録することもできます。 このトピックでは、ショートカット メニュー項目を登録するのとほぼ同じ方法で既定のプロシージャを登録するため、ここで説明します。

既定のプロシージャは、2 つの基本的な目的を果たします。 1 つは、任意のファイルの種類を開くためにアプリケーションを呼び出す方法を指定することです。 たとえば、コマンド ライン フラグを使用して、不明なファイルの種類が開かれていることを示す場合があります。 もう 1 つの目的は、ショートカット メニュー項目やアイコンなど、ファイルの種類のさまざまな特性を定義することです。 ユーザーがアプリケーションを追加のファイルの種類に関連付ける場合、その種類にはこれらの特性があります。 追加のファイルの種類が以前に別のアプリケーションに関連付けられていた場合、これらの特性によって元のファイルが置き換えられます。

既定のプロシージャを登録するには、アプリケーションの ProgID 用に作成したのと同じレジストリ キーを、アプリケーションのサブキーの下HKEY_CLASSES_ROOT\アプリケーションに配置します。 FriendlyAppName 値を含めて、アプリケーションのフレンドリ名をシステムに指定することもできます。 アプリケーションのフレンドリ名は実行可能ファイルから抽出することもできますが、FriendlyAppName 値が存在しない場合に限られます。 次のレジストリ フラグメントは、フレンドリ名といくつかのショートカット メニュー項目を定義するMyProgram.exeの既定の手順の例を示しています。 コマンド文字列には、任意のファイルの種類を開くことをアプリケーションに通知する /a フラグが含まれています。 DefaultIcon サブキーを含める場合は、汎用アイコンを使用する必要があります。

HKEY_CLASSES_ROOT
   Applications
      MyProgram.exe
         FriendlyAppName = Friendly Name
         shell
            open
               command
                  (Default) = C:\MyDir\MyProgram.exe /a "%1"
            print
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1"
            printto
               command
                  (Default) = C:\MyDir\MyProgram.exe /a /p "%1" "%2" %3 %4

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

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

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

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

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

 

次の図は、ファイルの種類とカスタマイズ アイコンの例として使用される .myp ファイルの種類の [新しい] サブメニューを示しています。 これで、 MyProgram アプリケーションというコマンドが追加されました。 ユーザーが [新規] サブメニューから [MyProgram アプリケーション] を選択すると、シェルによって "New MyProgram Application.myp" という名前のファイルが作成され、MyProgram.exeに渡されます。

カスタムの新しいメニューのスクリーン ショット

レジストリ エントリは次のようになります。

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
            NullFile
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = C:\MyDir\MyProgram.exe,2
      Shell
         (Default) = doit
         open
            command
               (Default) = C:\MyDir\MyProgram.exe "%1"
         doit
            (Default) = &Do It
            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" %3 %4