简体   繁体   English

发送文件夹重命名命令到Windows资源管理器

[英]Send Folder Rename Command to Windows Explorer

I have a shell extension made in .NET that creates folders (think of it as a context menu New -> New Folder option clone) and uses a InputBox to input the name of the folder from the user. 我在.NET中创建了一个shell扩展,用于创建文件夹(将其视为上下文菜单New - > New Folder选项克隆),并使用InputBox从用户输入文件夹的名称。 Instead I want to send the rename command on the folder to the already open Windows Explorer window. 相反,我想将文件夹上的rename命令发送到已经打开的 Windows资源管理器窗口。 It should be just like how Explorer lets us name a new folder: 它应该像Explorer让我们命名一个新文件夹一样:

PIC

On searching, I found this : Windows Explorer Shell Extension: create file and enter "rename" mode . 在搜索时,我发现了这个: Windows资源管理器Shell扩展:创建文件并进入“重命名”模式 It says to use the IShellView::SelectItem function with the SVSI_EDIT flag. 它说使用带有SVSI_EDIT标志的IShellView::SelectItem函数。 How do I do that with .NET? 我如何用.NET做到这一点? If that's hard, is there another way to do the same? 如果这很难,还有另一种方法可以做同样的事吗?

Here is some code that does this kind of things. 以下是一些执行此类操作的代码。 You use it like this: 你这样使用它:

private void button1_Click(object sender, EventArgs e)
{
    SelectItemInExplorer(Handle, @"d:\temp\new folder", true);
}

And the code: 和代码:

public static void SelectItemInExplorer(IntPtr hwnd, string itemPath, bool edit)
{
    if (itemPath == null)
        throw new ArgumentNullException("itemPath");

    IntPtr folder = PathToAbsolutePIDL(hwnd, Path.GetDirectoryName(itemPath));
    IntPtr file = PathToAbsolutePIDL(hwnd, itemPath);
    try
    {
        SHOpenFolderAndSelectItems(folder, 1, new[] { file }, edit ? 1 : 0);
    }
    finally
    {
        ILFree(folder);
        ILFree(file);
    }
}

[DllImport("shell32.dll")]
private static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, IntPtr[] apidl, int dwFlags);

[DllImport("shell32.dll")]
private static extern void ILFree(IntPtr pidl);

[DllImport("shell32.dll")]
private static extern int SHGetDesktopFolder(out IShellFolder ppshf);

[DllImport("ole32.dll")]
private static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);

[ComImport, Guid("000214E6-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IShellFolder
{
    void ParseDisplayName(IntPtr hwnd, IBindCtx pbc, [In, MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName, out uint pchEaten, out IntPtr ppidl, ref uint pdwAttributes);
    // NOTE: we declared only what we needed...
}

private static IntPtr GetShellFolderChildrenRelativePIDL(IntPtr hwnd, IShellFolder parentFolder, string displayName)
{
    IBindCtx bindCtx;
    CreateBindCtx(0, out bindCtx);
    uint pchEaten;
    uint pdwAttributes = 0;
    IntPtr ppidl;
    parentFolder.ParseDisplayName(hwnd, bindCtx, displayName, out pchEaten, out ppidl, ref pdwAttributes);
    return ppidl;
}

private static IntPtr PathToAbsolutePIDL(IntPtr hwnd, string path)
{
    IShellFolder desktopFolder;
    SHGetDesktopFolder(out desktopFolder);
    return GetShellFolderChildrenRelativePIDL(hwnd, desktopFolder, path);
}

这是一种间接方法,但您可以使用SendKeys函数将F2键发送到当前打开的Windows资源管理器窗口,然后模拟所需文件夹名称的输入并发送Enter键。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM