2011-12-27 94 views
3

我有一個在.NET中創建的用於創建文件夾的外殼擴展(將其視爲上下文菜單新建 - >新建文件夾選項克隆),並使用輸入框輸入文件夾的名稱用戶。相反,我想將文件夾中的重命名命令發送到已打開 Windows資源管理器窗口。它應該只是想瀏覽器如何讓我們定義一個新的文件夾:將文件夾重命名命令發送到Windows資源管理器

Pic

上進行搜索,我發現這一點:Windows Explorer Shell Extension: create file and enter "rename" mode。它說使用IShellView::SelectItem函數和SVSI_EDIT標誌。我如何使用.NET來做到這一點?如果這很難,還有另一種方法可以做到這一點嗎?

+3

貴外殼擴展實現IShellView COM接口? – 2011-12-27 21:33:56

+6

請注意,不推薦或不支持.NET外殼擴展。 – 2011-12-29 17:59:33

回答

6

下面是一些代碼,做這種事情。您可以使用這樣的:

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

這是一種間接方法,但您可以使用SendKeys函數將F2鍵發送到當前打開的Windows資源管理器窗口,然後模擬所需文件夾名稱的鍵入併發送Enter鍵。

+0

如果您知道文件夾名稱,請鍵入其名稱以獲得焦點,否則只需按日期排序文件夾,然後發送{END}鍵。 – 2011-12-30 16:22:17

+0

您可以自己激活資源管理器窗口,然後激活您的應用程序。 – 2011-12-30 19:35:28

相關問題