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

エクスプローラの新規作成メニューに項目を追加する

エクスプローラで右クリックしてコンテキストメニューを表示し、「新規作成」を選択すると、指定されたタイプのファイルを新しく作成することができます。ここではこの「新規作成」メニューに独自の項目を追加する方法を紹介します。

この方法は「@IT:Windows TIPS -- Tips:エクスプローラの[新規作成]メニューをカスタマイズする」で詳しく紹介されています。これによると、そのためにはレジストリにデータを書き込む必要があります。

「新規作成」メニューを選択した時、どのようなファイルが作成されるかは、数種類あります。@ITではこの内2つ(サイズ0のファイルと、テンプレートファイルを基にしたファイル)しか紹介されていませんが、実は他にもあります。ここでは分かっている限りのすべてを紹介します。

どの種類を選択した場合でもまずは拡張子への関連付けが必要ですので、「アプリケーションをファイルの拡張子に関連付ける」により、新規作成させたいファイルの拡張子を登録しておきます。ここではすでに関連付けは完了しているものとして話を進めます。

空のファイルを新規作成する

初めに、「新規作成」メニューによってサイズ0(空)のファイルが作成されるようにする方法を説明します。この場合は簡単で、レジストリの

HKEY_CLASSES_ROOT\(拡張子)\ShellNew

というキーに名前が"NullFile"でデータが空("")の値を作成するだけです。

以下にサンプルを示します。ここではすでに拡張子".000"がアプリケーションに関連付けられているものとして、".000"ファイルを新規作成できるようにしています。

VB.NET
コードを隠すコードを選択
'拡張子
Dim extension As String = ".000"

'「新規作成」により、空のファイルを作成
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\ShellNew")
regkey.SetValue("NullFile", "")
regkey.Close()
C#
コードを隠すコードを選択
//拡張子
string extension = ".000";

//「新規作成」により、空のファイルを作成
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew");
regkey.SetValue("NullFile", "");
regkey.Close();

テンプレートを基にしたファイルを新規作成する

次に、テンプレートファイルを基にして(コピーして)、ファイルが新規作成されるようにする方法を紹介します。

この場合は、まずテンプレートファイルをWindowsのテンプレートフォルダに作成しておきます。そして、先と同じレジストリのShellNewキーに名前が"FileName"でデータがテンプレートのファイル名の値を登録します。なおWindowsテンプレートフォルダのパスは、「System.Environment.GetFolderPath(Environment.SpecialFolder.Templates)」で取得できます。

テンプレートファイルを使用してファイルが新規作成されるようにする例を示します。ここではレジストリへの登録の他に、テンプレートファイルの作成も行っています。

VB.NET
コードを隠すコードを選択
'拡張子
Dim extension As String = ".000"
'テンプレートファイル名
Dim templateName As String = "myapp.000"
'テンプレートファイルのパス
Dim templatePath As String = _
    System.Environment.GetFolderPath(Environment.SpecialFolder.Templates) + _
    "\" + templateName
'テンプレートの中身
Dim templateText As String = "DOBON.NET"

'テンプレートファイルを作成する
Dim sw = New System.IO.StreamWriter(templatePath)
sw.Write(templateText)
sw.Close()

'「新規作成」により、テンプレートファイルを作成
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\ShellNew")
regkey.SetValue("FileName", templateName)
regkey.Close()
C#
コードを隠すコードを選択
//拡張子
string extension = ".000";
//テンプレートファイル名
string templateName = "myapp.000";
//テンプレートファイルのパス
string templatePath =
    System.Environment.GetFolderPath(Environment.SpecialFolder.Templates) +
    "\\" + templateName;
//テンプレートの中身
string templateText = "DOBON.NET";

//テンプレートファイルを作成する
System.IO.StreamWriter sw = new System.IO.StreamWriter(templatePath);
sw.Write(templateText);
sw.Close();

//「新規作成」により、テンプレートファイルを作成
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew");
regkey.SetValue("FileName", templateName);
regkey.Close();

バイナリデータを基にしたファイルを新規作成する

"HKEY_CLASSES_ROOT\(拡張子)\ShellNew"キーに名前が"Data"でデータがバイナリの値を作成すると、新規作成のとき、そのバイナリが内容となるファイルが新規作成されるようになります。

VB.NET
コードを隠すコードを選択
'拡張子
Dim extension As String = ".000"
'新規作成されるファイルの内容
Dim newFileData As Byte() = System.Text.Encoding.UTF8.GetBytes("DOBON.NET")

'「新規作成」で作成されるファイルの内容を登録する
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension & "\ShellNew")
regkey.SetValue("Data", newFileData)
regkey.Close()
C#
コードを隠すコードを選択
//拡張子
string extension = ".000";
//新規作成されるファイルの内容
byte[] newFileData = System.Text.Encoding.UTF8.GetBytes("DOBON.NET");

//「新規作成」で作成されるファイルの内容を登録する
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew");
regkey.SetValue("Data", newFileData);
regkey.Close();

コマンドを実行してファイルを新規作成する

"HKEY_CLASSES_ROOT\(拡張子)\ShellNew"キーに名前が"Command"でデータがコマンドラインの値を作成すると、新規作成の際、そのコマンドラインが実行されます。これは、例えばショートカットを新規作成するときのように、ウィザードを使ってファイルを作成するときなどに使用します。

以下の例では、新規作成で「notepad.exe "%1"」というコマンドが実行されるようにしています。このコマンドが実行される時点ではファイルは新規作成されておらず、作成すべきファイルのパスが「%1」で渡されます。この例の場合はnotepad.exe(メモ帳)が起動しますが、「%1」がまだ存在していないため、このファイルを新しく作成するか尋ねるウィンドウが表示されると思います。

VB.NET
コードを隠すコードを選択
'拡張子
Dim extension As String = ".000"
'新規作成の時に実行されるコマンドライン
Dim commandline As String = "notepad.exe ""%1"""

'「新規作成」で実行されるコマンドラインを登録する
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension & "\ShellNew")
regkey.SetValue("Command", commandline)
regkey.Close()
C#
コードを隠すコードを選択
//拡張子
string extension = ".000";
//新規作成の時に実行されるコマンドライン
string commandline = "notepad.exe \"%1\"";

//「新規作成」で実行されるコマンドラインを登録する
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew");
regkey.SetValue("Command", commandline);
regkey.Close();

フォルダを新規作成する

MSDNの「Creating Shortcut Menu Handlers (Windows)」などでは、以上4種類のみ紹介されています。しかし「Windows レジストリ 解剖記: HKEY_CLASSES_ROOT」によると、もう一種類"Directory"というものがあります。

"HKEY_CLASSES_ROOT\(拡張子)\ShellNew"キーに名前が"Directory"でデータが空の値を作成すると、新規作成の際、フォルダが作成されるようになります。これはWindows Vista以降で有効だということです。

VB.NET
コードを隠すコードを選択
'拡張子
Dim extension As String = ".000"

'「新規作成」でフォルダが作成されるようにする
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension & "\ShellNew")
regkey.SetValue("Directory", "")
regkey.Close()
C#
コードを隠すコードを選択
//拡張子
string extension = ".000";

//「新規作成」でフォルダが作成されるようにする
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew");
regkey.SetValue("Directory", "");
regkey.Close();
補足:ここで紹介したShellNewのサブキーは、複数存在したとしても、1つしか有効になりません。例えば"NullFile"と"FileName"の両方が存在する場合は、"NullFile"が優先されます。
  • 履歴:
  • 2014/8/19 Data、Commandのサンプルコードを追加。Directoryの説明を追加。

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

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