このチュートリアルのように、 SharpShellでプロジェクトの作成を開始して、新しいシェル コンテキスト メニューを登録できます。
ここでは、 を実装するクラスを定義する必要がありますSharpContextMenu
。簡単にするために、任意のファイルタイプのメニューを作成し、常に表示します。
[ComVisible(true)]
[COMServerAssociation(AssociationType.AllFiles)]
public class CopyFilesExtension : SharpContextMenu
{
protected override bool CanShowMenu()
{
return true;
}
protected override ContextMenuStrip CreateMenu()
{
var menu = new ContextMenuStrip();
var copyFiles = new ToolStripMenuItem { Text = "Copy Files To Folder..." };
copyFiles.Click += (sender, args) => CopyFiles();
menu.Items.Add(copyFiles);
return menu;
}
private void CopyFiles()
{
...
}
}
しかし、私はあなたがこれをすべてやったと確信しています.ここでの問題はCopyFiles()
メソッドを実装することです.
これを行う 1 つの方法は、次のようなフォルダーの名前を尋ねるダイアログを表示することです。

次に、CopyFiles()
次のように実装します。
private void CopyFiles()
{
using (var dialog = new CopyFileDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
var folder = Path.GetDirectoryName(SelectedItemPaths.First());
var newFolder = Path.Combine(folder, dialog.FolderName);
Directory.CreateDirectory(newFolder);
foreach (var path in SelectedItemPaths)
{
var newPath = Path.Combine(newFolder, Path.GetFileName(path));
File.Move(path, newPath);
}
}
}
}
上記のコードでは、フォルダーの名前を尋ね、フォルダーを作成し、最後に選択したファイルをそのフォルダーに移動しました。
ただし、 Windows エクスプローラーでRenameコマンドを使用して実行したい場合は、必要なWin32関数をインポートすることから始めることができます。
class Win32
{
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr ILCreateFromPath([In, MarshalAs(UnmanagedType.LPWStr)] string pszPath);
[DllImport("shell32.dll")]
public static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, IntPtr[] apidl, int dwFlags);
[DllImport("shell32.dll")]
public static extern void ILFree(IntPtr pidl);
}
ILCreateFromPath
ファイル名からPIDLを取得できます。
SHOpenFolderAndSelectItems
ファイルを選択して名前変更コマンドを送信できるようにします。
ILFree
PIDL
管理されていない作成済みを解放します。
これらのWin32CopyFiles()
関数を使用して、次のように定義できます。
private void CopyFiles()
{
var folder = Path.GetDirectoryName(SelectedItemPaths.First());
var newFolder = Path.Combine(folder, "New Folder");
Directory.CreateDirectory(newFolder);
foreach (var path in SelectedItemPaths)
{
var newPath = Path.Combine(newFolder, Path.GetFileName(path));
File.Move(path, newPath);
}
RenameInExplorer(newFolder);
}
private static void RenameInExplorer(string itemPath)
{
IntPtr folder = Win32.ILCreateFromPath(Path.GetDirectoryName(itemPath));
IntPtr file = Win32.ILCreateFromPath(itemPath);
try
{
Win32.SHOpenFolderAndSelectItems(folder, 1, new[] { file }, 1);
}
finally
{
Win32.ILFree(folder);
Win32.ILFree(file);
}
}
SharpShell.Interop.Shell32
このクラスで使用できる唯一のメソッドは、ShellExecuteEx()
新しいプロセスを起動するために使用されるため、使用できません。