Отправить команду переименования папки в Windows Explorer - PullRequest
3 голосов
/ 27 декабря 2011

У меня есть расширение оболочки, созданное в .NET, которое создает папки (воспринимает его как контекстное меню New -> New Folder option clone) и использует InputBox для ввода имени папки от пользователя. Вместо этого я хочу отправить команду переименования папки в уже открытое окно проводника Windows. Это должно быть похоже на то, как Explorer позволяет нам называть новую папку:

Pic

При поиске я нашел это: Расширение оболочки Windows Explorer: создайте файл и войдите в режим «переименования» . В нем говорится об использовании функции IShellView::SelectItem с флагом SVSI_EDIT. Как мне сделать это с .NET? Если это сложно, есть ли другой способ сделать то же самое?

Ответы [ 2 ]

6 голосов
/ 30 декабря 2011

Вот код, который делает такие вещи. Вы используете это так:

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

и код:

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);
}
2 голосов
/ 30 декабря 2011

Это своего рода косвенный подход, но вы можете использовать функцию SendKeys , чтобы отправить клавишу F2 в открытое в настоящее время окно проводника Windows, а затем смоделировать ввод нужного имени папки иотправить ключ ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...