Windowsの右クリックメニューは、コンテキストメニューとも呼ばれ、クリックする場所によってメニュー内容が変化するように作られている。実際にはクリックされた場所にあるアプリケーションやWindowsがメニューを出す仕組みなので、アプリケーションによってはメニューが表示されないこともある。右クリックメニューを出すのか、何をだすのかはアプリケーションが決定しているのである。

エクスプローラーの右クリックメニューはユーザーによってカスタマイズも可能だ
エクスプローラーで表示できる
右クリックメニューはカスタマイズできる
利用頻度の高いエクスプローラーの場合、扱う対象がファイルやフォルダなどのファイルシステム関連のものであるため、ファイルやフォルダといった種類や、ファイルタイプなどによって、右クリックメニューに表示される項目を制御することが可能だ。
エクスプローラーはWindowsでは「シェル」と呼ばれる中核をなすプログラムだ。単独のプログラムでありながら、Windowsの一部といってもいいほど、深くWindowsと関係している。たとえば、デスクトップやタスクバー、スタートメニュー、スタート画面もエクスプローラーが関わっている。このため、ファイルシステム関連のものにコンテキストメニューに関する設定を行うことで、エクスプローラー内に表示される右クリックメニューに項目を追加することが可能になる。
この設定はレジストリで行なう。レジストリの「HKEY_CLASSES_ROOT」以下にある拡張子をキーとする項目(ピリオドで始まるキー)やExefile(実行ファイル)やFolder(フォルダ)などのキーを持つ項目に設定を行うことで、エクスプローラー(デスクトップを含む)内でオブジェクトや背景(Background)を右クリックしたときに表示されるコンテキストメニューに項目を追加できる。
項目はいくつも追加可能で、複数の方法があるが、ここでは、COMコンポーネントを追加する方法(Visual Studioなどによる開発が必要)は解説せず、直接実行ファイルやコマンドを記述できる方法のみを解説する。
対象となる場所、オブジェクトとレジストリーキーの対応は下の表のようなものになる。たとえば、フォルダに対して右クリックキー項目を追加したい場合「HKEY_CLASSES_ROOT\Folder\Shell」に追加したいコマンドに対応するキーを登録する(記述方法は後述)。
場所/対象 | レジストリキー | 備考 |
---|---|---|
特定のファイル(拡張子) | HKEY_CLASSES_ROOT\拡張子 | 特定の拡張子(.txtなどのようにピリオドで始まるキー) |
ショートカット(.lnk) | HKEY_CLASSES_ROOT\.lnk | 拡張子.lnkの設定は無効 |
実行ファイル(exeファイル) | HKEY_CLASSES_ROOT\exefile | exeファイルのみ |
任意のファイル(*) | HKEY_CLASSES_ROOT\* | 拡張子キーに登録がないファイルすべて |
フォルダ | HKEY_CLASSES_ROOT\Folder | コントロールパネルやネットワークなどの特殊フォルダを含む |
ディレクトリ | HKEY_CLASSES_ROOT\Directory | ファイルフォルダ/ディレクトリ(特殊フォルダは含まない) |
ドライブ | HKEY_CLASSES_ROOT\Drive | ドライブはフォルダの1種になる |
デスクトップ | HKEY_CLASSES_ROOT\DesktopBackground | デスクトップの何もない部分 |
すべてのオブジェクト | HKEY_CLASSES_ROOT\AllFilesystemObjects | エクスプローラーに表示されるすべてのオブジェクト(優先順位低) |
ファイルウィンドウの何もないところ | HKEY_CLASSES_ROOT\Directory\Background | エクスプローラー内でのみ有効 |
ネットワークの共有名 | HKEY_CLASSES_ROOT\Network | ネットワークの共有名のところ |
ネットワークサーバー | HKEY_CLASSES_ROOT\NetServer | ネットワークサーバーアイコンの上 |
ただし、それぞれのレジストリキーで効果が及ぶ対象が違い、キーによっては複数のオブジェクトが対象になり、さらに、各設定には優先度があって、上位のキーが設定されていると、下位のキーによる設定がコンテキストメニューに表示されないといったことが起こる。
この設定自体はWindows初期からある機能で、Windowsの進化と共にエクスプローラーで表示できるオブジェクトが変化してきたことによる結果だ。たとえば、Windows 95からは、フォルダの概念が導入され、記憶装置上のディレクトリと特殊フォルダ(ネットワーク、コントロールパネル、Vistaのライブラリなど)を合わせて「フォルダ」と総称するようになった。このため、レジストリ設定には、MS-DOSのディレクトリを対象とする「Directory」というキーと、95以後のフォルダを対象とする「Folder」というキーがある。
Folderキーにメニュー項目が追加されていないと、Directoryキーの設定が有効になって、ここに設定したメニュー項目が表示されるが、Folderキー側でコンテキストメニュー項目を設定してしまうと、Directoryキー側の項目は表示されなくなってしまう。
同様にすべてのファイルを表す「*」キーや、すべてのオブジェクトを表す「AllFileSystemObjects」キーのように対象が広く、他の場所を含む登録場所もある。もし、複数の場所で同一のキー名でメニューが追加された場合、Windowsが決める優先順位で表示されるメニュー項目が決定する。
場所/対象 | 略号 | 右クリック対象物 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ft | ex | xe | * | sv | sh | dr | sf※1 | di | lk※2 | dt | bk | ||
拡張子キー(関連づけなし) | ft | 7 | |||||||||||
拡張子キー(関連づけあり) | ex | ○※3 | |||||||||||
実行ファイル(Exefile) | xe | ○ | |||||||||||
任意のファイル(*) | * | ↑ | ↑ | ↑ | ○ | ||||||||
ネットワークサーバー(NetServer) | sv | ○ | |||||||||||
共有名(Network) | sh | ○ | |||||||||||
ドライブ(Drive) | dr | ○ | |||||||||||
フォルダ(Folder) | ー | ↑ | ↑ | ↑ | ○ | ○ | |||||||
ディレクトリ(Directory) | di | ↑ | ↑ | ||||||||||
すべてのオブジェクト(AllFileSystemObjects) | al | ↑ | ↑ | ↑ | ↑ | ↑ | ↑※4 | ↑ | ○ | ||||
デスクトップ(Desktop) | dt | ○ | |||||||||||
ファイルウィンドウの何もないところ(Directory\Background) | bk | ↑ | ○ |
○:Windows 7/8で有効、7:8.1では無効、↑:上位の項目が設定されていなければ表示される
※1:sf=特殊フォルダ、※2:ショートカット、※3:「開く」項目の代わりに表示される(他の設定がないとき)、※4:ライブラリ、コントロールパネルなどの一部の特殊フォルダのみ
たとえば、Folder(HKEY_CLASSES_ROOT\Folderのこと)は、対象として特殊フォルダとファイルフォルダ(MS-DOSでいうディレクトリ)を含む。ここにコンテキストメニュー項目を登録したとき、同じ名前のキーをDirectoryに登録してもメニュー項目は表示されない。キー名が違っていれば、対象がファイルフォルダーならメニュー項目が表示される。
また、Folder側に登録したメニュー項目を削除するとDirectory側に登録したメニュー項目が表示されるようになる。このため、同一のコマンドを対象によって切り替えたい場合には、同じキーを使い、違うコマンドの場合には、別のキーを使って、対象上で右クリックしたら常に表示するといった制御が可能だ。
また、Windowsのバージョンによっても少し動作が違う。本連載で対象にしているのは基本的にWindows 7とWindows 8.1だが、たとえば、ショートカットファイルに対応ずる「.lnk」の拡張子キーは、7以後のWindowsでは無効になっている。また、個々の「拡張子」に対して「右クリック」メニューを追加する方法のうち、今回解説する「shell」キーを使う方法は、Windows 8.1では無効だが、COMコンポーネントによるContexMenuHandlerを登録する方法は有効なようだ。
shellキーを使うコンテキストメニューの登録は、古いやり方なので、マイクロソフトとしては、段階的に排除しているのかもしれない。ただ、Windows 7や8.1以前に開発されたアプリケーションでは、この方法を使っているものも少なくないため、shellキーを使う方法自体は当面残ると思われる。

この連載の記事
-
第473回
PC
Windowsは内部的にどうやってインターネットへの接続状態を確認している? -
第472回
PC
WindowsのエラーをMicrosoftに送信するテレメトリ機能を理解する -
第471回
PC
Windowsのコマンドラインでエイリアスを使う -
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる - この連載の一覧へ