エクスプローラでフォルダやドライブを右クリックしたときに表示されるコンテキストメニューには、「開く」や「新しいウィンドウで開く」などの項目が表示されると思いますが、ここに新たな項目を追加し、指定したアプリケーションを起動させる方法を紹介します。
実はこれを行うにはフォルダやドライブに関連付けを行えばよく、「アプリケーションをファイルの拡張子に関連付ける」とほとんど同じ方法で実現できます。「アプリケーションをファイルの拡張子に関連付ける」では、拡張子(またはファイルタイプ名)のキーに情報を書き込みましたが、フォルダやドライブへの関連付けでは特別な名前のキーに情報を書き込みます。その特別な名前は、フォルダの場合は"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で開く"という項目を表示させるサンプルを以下に示します。ただし関連付けの方法についての説明はしませんので、よく分からないという場合はまず「アプリケーションをファイルの拡張子に関連付ける」をご覧ください。
'実行するコマンドライン 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()
//実行するコマンドライン 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メソッドなどを使って、追加したキーを全て削除します。
'動詞 Dim verb As String = "openmyapp" 'レジストリキーを削除 Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("Folder\shell\" & verb)
//動詞 string verb = "openmyapp"; //レジストリキーを削除 Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("Folder\\shell\\" + verb);
(この記事は、「.NETプログラミング研究 第41号」で紹介したものです。)