DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

エクスプローラでフォルダやドライブを右クリックしたときに表示されるコンテキストメニューに項目を追加する

エクスプローラでフォルダやドライブを右クリックしたときに表示されるコンテキストメニューには、「開く」や「新しいウィンドウで開く」などの項目が表示されると思いますが、ここに新たな項目を追加し、指定したアプリケーションを起動させる方法を紹介します。

実はこれを行うにはフォルダやドライブに関連付けを行えばよく、「アプリケーションをファイルの拡張子に関連付ける」とほとんど同じ方法で実現できます。「アプリケーションをファイルの拡張子に関連付ける」では、拡張子(またはファイルタイプ名)のキーに情報を書き込みましたが、フォルダやドライブへの関連付けでは特別な名前のキーに情報を書き込みます。その特別な名前は、フォルダの場合は"Folder"、ドライブの場合は"Drive"、ファイルフォルダの場合は"Directory"です。

"Folder"と"Directory"の違いは、「c# - Folder right click menu(Only Folder) - Stack Overflow」などによると、いろいろあるようです。"Directory"に書き込んだ項目は、通常のフォルダを右クリックした時のコンテキストメニューに表示されます。"Folder"の場合は、通常のフォルダとドライブの他、ゴミ箱、ネットワーク、コントロールパネルなどでも表示されます。

"Folder"と"Directory"の両方に同じ名前の項目が存在した場合は、"Folder"が優先されます。同様に、"Folder"と"Drive"の両方に同じ名前の項目が存在した場合も、"Folder"が優先されます。

しかしエクスプローラの左側のペインに表示されるフォルダを右クリックした時は、"Folder"にある項目は表示されず、"Directory"にある項目が表示されます。同様にドライブを右クリックした時も、"Drive"にある項目が表示されます。

この3つ以外にも特別な意味を持つキーがいくつかあります。例えば、"*"はすべてのファイルを意味し、"AllFileSystemObjects"はすべてのファイルとフォルダを意味します。詳しくは「Creating Shell Extension Handlers」等をご覧ください。

補足:"Directory\background"というキーに書き込まれた項目は、エクスプローラやデスクトップの何もないところを右クリックしてコンテキストメニューを表示した時に表示されます。

"Folder"への関連付けにより、エクスプローラでフォルダを右クリックしたときに"MyApplicationで開く"という項目を表示させるサンプルを以下に示します。ただし関連付けの方法についての説明はしませんので、よく分からないという場合はまず「アプリケーションをファイルの拡張子に関連付ける」をご覧ください。

VB.NET
コードを隠すコードを選択
'実行するコマンドライン
Dim commandline As String = """" + Application.ExecutablePath & """ ""%1"""
'動詞
Dim verb As String = "openmyapp"
'説明(エクスプローラのコンテキストメニューに表示される)
Dim description As String = "MyApplicationで開く(&M)"

'フォルダへの関連付けを行う
Dim cmdkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey( _
        "Folder\shell\" & verb & "\command")
cmdkey.SetValue("", commandline)
cmdkey.Close()

'説明を書き込む
Dim verbkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey( _
        "Folder\shell\" & verb)
verbkey.SetValue("", description)
verbkey.Close()
C#
コードを隠すコードを選択
//実行するコマンドライン
string commandline = "\"" + Application.ExecutablePath + "\" \"%1\"";
//動詞
string verb = "openmyapp";
//説明(エクスプローラのコンテキストメニューに表示される)
string description = "MyApplicationで開く(&M)";

//フォルダへの関連付けを行う
Microsoft.Win32.RegistryKey cmdkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(
        "Folder\\shell\\" + verb + "\\command");
cmdkey.SetValue("", commandline);
cmdkey.Close();

//説明を書き込む
Microsoft.Win32.RegistryKey verbkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(
        "Folder\\shell\\" + verb);
verbkey.SetValue("", description);
verbkey.Close();

追加した項目を削除するには、RegistryKey.DeleteSubKeyTreeメソッドなどを使って、追加したキーを全て削除します。

VB.NET
コードを隠すコードを選択
'動詞
Dim verb As String = "openmyapp"

'レジストリキーを削除
Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("Folder\shell\" & verb)
C#
コードを隠すコードを選択
//動詞
string verb = "openmyapp";

//レジストリキーを削除
Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("Folder\\shell\\" + verb);
  • 履歴:
  • 2010/7/4 追加した項目を削除する方法を追記。
  • 2014/8/6 サンプルコードで、項目の説明を値として書き込むようにした。"Folder"と"Directory"の詳しい説明を追加など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、レジストリへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。