Lyn*_*ynn 12 c# windows-shell sharpshell
我正在使用SharpShell编写一个小的新shell上下文菜单项,将当前选定的文件复制到新的子文件夹,然后提示用户输入目录的新名称.
搜索StackOverflow,我找到了这个答案.但是,我想在SharpShell中做同样的事情.
我会以某种方式对它进行射击SVSI_EDIT,我可以深深地找到它,SharpShell.Interop但我不确定这是如何工作的.我找不到任何文档或代码示例.
(编辑:我想找出如何Pidl从文件名中获取一个好的开始,但也许我根本不需要它?)
您可以开始使用SharpShell创建项目来注册新的 shell 上下文菜单,如本教程中所示。
在这里,我们必须定义一个实现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()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
但我确信你已经完成了这一切,这里的问题是实现该CopyFiles()方法。
一种方法是显示一个对话框,询问文件夹的名称,如下所示:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我们询问文件夹的名称,然后创建文件夹,最后将选定的文件移动到该文件夹。
但是,如果您想在Windows 资源管理器中使用重命名命令来执行此操作,我们可以首先导入一些所需的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);
}
Run Code Online (Sandbox Code Playgroud)
ILCreateFromPath允许我们从文件名中获取PIDL 。SHOpenFolderAndSelectItems允许我们选择文件并发送重命名命令。ILFree释放非托管PIDL创建的。通过这些Win32函数,我们可以定义CopyFiles()如下:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我们不能使用SharpShell.Interop.Shell32,因为此类中唯一可用的方法是ShellExecuteEx()用于启动新进程。
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |