2011-11-18 22 views
8

tôi có thể dễ dàng nhận Explorer để mở ra và chọn một tập tin bằng cách sử dụng sau đây:Làm cách nào tôi có thể đặt một cá thể Explorer.exe hiện có để chọn một tệp?

string argument = @"/select, " + filePath; 
System.Diagnostics.Process.Start("explorer.exe", argument); 

Tuy nhiên khi tôi đến mở cửa file tiếp theo, tôi sẽ nhận được một trường hợp mới của nhà thám hiểm. Điều này có thể dẫn đến việc người dùng của chúng tôi mở hàng trăm người khám phá mở vào cuối ngày chuyên sâu.

Tôi làm cách nào để sử dụng lại một cá thể trình khám phá đã mở để chọn tệp tôi muốn?

Visual Studio có thể thực hiện việc này khi bạn nhấp chuột phải vào tab và chọn Mở thư mục chứa ... cung cấp trình khám phá đã được mở tại cùng một thư mục. Làm thế nào nó có thể làm được điều này?

+3

Tại sao bạn phải sử dụng nhà thám hiểm ngay từ đầu? Bạn đang cố gắng đạt được điều gì? – ChrisBint

+0

Tại sao không sử dụng 'System.Diagnostics.Process.Start (filePath)'? Bằng cách đó bạn mở tệp bằng chương trình mặc định được gán. – Alex

+0

@ChrisBint Ứng dụng của chúng tôi có khách hàng. Mỗi khách hàng có một thư mục chứa các tài liệu khác nhau của họ. Chúng tôi muốn tùy chọn mở trình thám hiểm tại thư mục khách hàng để họ có thể duyệt/chỉnh sửa/sao chép vv ... tài liệu khách hàng. –

Trả lời

3

Làm thế nào về embedding the Explorer window into your application bằng cách sử dụng các đối tượng ExplorerBrowser? Bằng cách đó, bạn chỉ có thể tiếp tục sử dụng lại cửa sổ bằng cách gọi IExplorerBrowser::BrowseToObject trên một thư mục khác khi bạn muốn hiển thị một thư mục khác.

Cố gắng định hướng lại cửa sổ Explorer hiện tại có vấn đề vì bạn không biết người dùng đã làm gì với cửa sổ đó trong khi bạn không tìm kiếm. Có thể họ đã sử dụng ngăn Thư mục để đi đến một số thư mục khác, sau đó bùng nổ bạn vừa tách thư mục đó ra khỏi chúng và gửi nó đến một nơi khác. Hoặc có thể họ đã đóng cửa! Việc mở một cửa sổ Explorer mới là một loại điều lửa và quên. Nếu bạn muốn giữ quyền kiểm soát cửa sổ, thì bạn cần thực hiện kiểm soát rõ ràng hơn (ví dụ: qua ExplorerBrowser ở trên).

+0

Bản thân Windows sử dụng hành vi này khi sử dụng lại các cửa sổ khám phá đã mở. Ví dụ, chọn một thư mục và gõ Ctrl + Enter để mở nó trong một cửa sổ mới. Nếu bạn làm điều đó một lần nữa, nó không mở một thể hiện cửa sổ mới. –

+0

Điều đó không giống với việc đổi hướng một cửa sổ hiện có. –

+0

tốt, sau đó sử dụng menu ngữ cảnh sau đó trong một phím tắt (Windows 7) và nhấp vào 'tìm mục tiêu' hoặc tương tự (tôi có phiên bản tiếng Tây Ban Nha). Nếu tệp đích nằm trong một cửa sổ đang mở, Windows sẽ sử dụng lại nó. –

0

Bạn đã thử nhận một phiên bản của lớp Process và luôn sử dụng lớp đó để gọi phương thức Start()?

Process myProcess = new Process(); 
string argument = @"/select, " + filePath; 

myProcess.StartInfo.FileName = argument; 
myProcess.Start(); 
+0

Điều này hoạt động nếu đường dẫn tương tự như cuộc gọi trước đó. Mở một cửa sổ mới trên những con đường khác nhau. – Alex

+0

Theo [tài liệu] (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx), 'Bắt đầu()' sẽ "bắt đầu (hoặc sử dụng lại) tài nguyên quy trình". Vì vậy, điều đó ngụ ý rằng bạn có thể thay đổi giá trị của 'myProcess.StartInfo.FileName' và gọi' Start() 'một lần nữa? – Widor

+1

@Widor Đây không phải là câu trả lời, đúng hơn là một câu hỏi. Nếu không xác nhận nếu nó hoạt động từ người trả lời, đó là một suy đoán thuần túy. – Marek

0

Cách tiếp cận khác là cách API Win32.

StringBuilder sb = new StringBuilder(@"C:\temp\"); 
hWnd = (...) // get Handle of the Explorer's address field. 
SendMessage(hWnd, WM_SETTEXT, new IntPtr(sb.ToString().Length), sb) 

// Set the focus to the address field

SendMessage(hWnd, WM_SETFOCUS, IntPtr.Zero, null) 
// Simulate Enter key 
SendMessage(hWnd, WM_KEYDOWN, new IntPtr(VK_RETURN), null) 
+2

Không có cách nào để di chuyển trường địa chỉ và bạn không thể mô phỏng đầu vào một cách đáng tin cậy bằng cách gửi tin nhắn. –

+1

Bạn có thể liệt kê tất cả các cửa sổ con của quá trình thám hiểm và bằng cách kiểm tra CLASS, tìm hiểu trường địa chỉ. Có một cái nhìn tại Spy ++. – Alex

+3

Săn tìm một CLASS cụ thể không phải là di động. Tên lớp của thanh địa chỉ đã thay đổi qua nhiều năm và có thể sẽ thay đổi rất nhiều trong tương lai. –

1

Một chút trễ cho bữa tiệc, nhưng nếu bạn muốn chọn một hoặc nhiều tệp trong thư mục đã mở trong cửa sổ trình khám phá, bạn có thể làm như vậy với phương thức shell32 SHOpenFolderAndSelectItems. Phương pháp đó tái sử dụng một cửa sổ hiện có nếu có, hoặc mở một cửa sổ mới nếu không.

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

[DllImport("shell32.dll")] 
private static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, out IntPtr pidl, uint sfgaoIn, out uint psfgaoOut); 

public static void ShowFileInExplorer(string folderPath, string filePath) 
{ 
    Shell32.SHParseDisplayName(Path.GetFullPath(folderPath), IntPtr.Zero, out IntPtr folder, 0, out uint psfgaoOut); 

    if (folder == IntPtr.Zero) 
    { 
     return; 
    } 

    Shell32.SHParseDisplayName(Path.GetFullPath(filePath), IntPtr.Zero, out IntPtr file, 0, out psfgaoOut); 

    if (file != IntPtr.Zero) 
    { 
     IntPtr[] files = { file }; 

     Shell32.SHOpenFolderAndSelectItems(folder, (uint)files.Length, files, 0); 
     Marshal.FreeCoTaskMem(file); 
    } 

    Marshal.FreeCoTaskMem(folder); 
} 

Mẫu này chỉ chọn một tệp nhưng có thể dễ dàng mở rộng để chọn nhiều tệp.

Các vấn đề liên quan