2011-12-27 3 views
3

폴더를 만드는 셸 확장 (상황에 맞는 메뉴 새로 만들기 -> 새 폴더 옵션 복제라고 생각 함)을 사용하고 InputBox를 사용하여 폴더 이름을 입력합니다. 사용자. 대신 폴더의 이름 바꾸기 명령을 (이미 열려있는 Windows 탐색기 창)으로 보내려고합니다. 그냥 탐색기 우리가 새 폴더의 이름을 수 있습니다 방법을 좋아해야한다 : Windows Explorer Shell Extension: create file and enter "rename" mode :폴더 이름 바꾸기 명령을 Windows 탐색기로 보내기

Pic

는 검색에, 나는이를 발견했다. SVSI_EDIT 플래그와 함께 IShellView::SelectItem 함수를 사용한다고합니다. .NET으로 어떻게 할 수 있습니까? 그게 어렵다면, 그 같은 또 다른 방법이 있습니까?

+3

는 쉘 확장이 IShellView COM 인터페이스를 구현 하는가? –

+6

.NET 셸 확장은 권장되거나 지원되지 않습니다. –

답변

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

이는 간접적 인 접근이지만, 현재 열려있는 Windows 탐색기 창에 F2 키를 보내고 원하는 폴더 이름을 입력하고 Enter 키를 보내면 SendKeys 기능을 사용할 수 있습니다.

+0

폴더 이름을 알고 있으면 이름을 입력하여 포커스를 받거나 그렇지 않으면 날짜순으로 폴더를 정렬하고 {END} 키를 보냅니다. –

+0

탐색기 창을 직접 활성화 한 다음 응용 프로그램을 다시 활성화 할 수 있습니다. –