エクスプローラで右クリックしてコンテキストメニューを表示し、「新規作成」を選択すると、指定されたタイプのファイルを新しく作成することができます。ここではこの「新規作成」メニューに独自の項目を追加する方法を紹介します。
この方法は「@IT:Windows TIPS -- Tips:エクスプローラの[新規作成]メニューをカスタマイズする」で詳しく紹介されています。これによると、そのためにはレジストリにデータを書き込む必要があります。
「新規作成」メニューを選択した時、どのようなファイルが作成されるかは、数種類あります。@ITではこの内2つ(サイズ0のファイルと、テンプレートファイルを基にしたファイル)しか紹介されていませんが、実は他にもあります。ここでは分かっている限りのすべてを紹介します。
どの種類を選択した場合でもまずは拡張子への関連付けが必要ですので、「アプリケーションをファイルの拡張子に関連付ける」により、新規作成させたいファイルの拡張子を登録しておきます。ここではすでに関連付けは完了しているものとして話を進めます。
初めに、「新規作成」メニューによってサイズ0(空)のファイルが作成されるようにする方法を説明します。この場合は簡単で、レジストリの
HKEY_CLASSES_ROOT\(拡張子)\ShellNew
というキーに名前が"NullFile"でデータが空("")の値を作成するだけです。
以下にサンプルを示します。ここではすでに拡張子".000"がアプリケーションに関連付けられているものとして、".000"ファイルを新規作成できるようにしています。
'拡張子 Dim extension As String = ".000" '「新規作成」により、空のファイルを作成 Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\ShellNew") regkey.SetValue("NullFile", "") regkey.Close()
//拡張子 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)」で取得できます。
テンプレートファイルを使用してファイルが新規作成されるようにする例を示します。ここではレジストリへの登録の他に、テンプレートファイルの作成も行っています。
'拡張子 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()
//拡張子 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"でデータがバイナリの値を作成すると、新規作成のとき、そのバイナリが内容となるファイルが新規作成されるようになります。
'拡張子 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()
//拡張子 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」がまだ存在していないため、このファイルを新しく作成するか尋ねるウィンドウが表示されると思います。
'拡張子 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()
//拡張子 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以降で有効だということです。
'拡張子 Dim extension As String = ".000" '「新規作成」でフォルダが作成されるようにする Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension & "\ShellNew") regkey.SetValue("Directory", "") regkey.Close()
//拡張子 string extension = ".000"; //「新規作成」でフォルダが作成されるようにする Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(extension + "\\ShellNew"); regkey.SetValue("Directory", ""); regkey.Close();
補足:ここで紹介したShellNewのサブキーは、複数存在したとしても、1つしか有効になりません。例えば"NullFile"と"FileName"の両方が存在する場合は、"NullFile"が優先されます。