2013-01-07 42 views
7

Tôi cần lấy bộ sưu tập tệp hiện tại được chọn trong Windows Explorer. Tôi tìm thấy mã sau đây từ here.Làm cách nào để tải các tệp đã chọn của Windows Explorer từ trong C#?

Tôi không hoàn toàn ở đó. Đối với một điều, nơi nào GetForegroundWindow đến từ đâu? Và đối với điều khác, trình biên dịch phàn nàn trên dòng

var shell = new Shell32.Shell(); 

nói

"Loại hoặc namespace tên 'shell32' không thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một hội ?) ". Tôi đã thêm SHDocVw làm tài liệu tham khảo, nhưng tôi vẫn không thể vượt qua trình biên dịch. Có thể ai đó vui lòng giúp tôi hoàn thành việc này không?

IntPtr handle = GetForegroundWindow(); 

    ArrayList selected = new ArrayList(); 
    var shell = new Shell32.Shell(); 
    foreach(SHDocVw.InternetExplorer window in shell.Windows()) { 
     if (window.HWND == (int)handle) 
     { 
      Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
      foreach(Shell32.FolderItem item in items) 
      { 
       selected.Add(item.Path); 
      } 
     } 
    } 
+0

thể trùng lặp của [C#: Trong những lắp ráp được SHDocVw.WebBrowser \ _V1 định nghĩa?] (Http: // stackoverflow .com/questions/3345687/c-in-what-assembly-là-shdocvw-webbrowser-v1-defined) – nawfal

Trả lời

6

bạn không cần phải lấy Handle (của trình khám phá).

Bạn cần tham chiếu đến SHDocVw, là đối tượng Microsoft Internet Controls COM và Shell32, là đối tượng Microsoft Shell Controls và Automation COM.

Sau đó thêm của bạn:

using System.Collections; 
using Shell32; 
using System.IO; 

Sau đó, điều này sẽ làm việc:

 string filename; 
     ArrayList selected = new ArrayList(); 
     foreach (SHDocVw.InternetExplorer window in new SHDocVw.ShellWindowsClass()) 
     { 
     filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower(); 
     if (filename.ToLowerInvariant() == "explorer") 
     { 
      Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
      foreach (Shell32.FolderItem item in items) 
      { 
      selected.Add(item.Path); 
      } 
     } 
     } 
+0

Điều này có vẻ tốt hơn, ngoại trừ tôi đang gặp phải sự cố biên dịch khác: –

+0

Vấn đề biên dịch là: Không thể nhúng loại Interop 'SHDocVw.ShellWindowsClass'. Thay vào đó, hãy sử dụng giao diện áp dụng. –

+0

Tôi đã thay đổi ShellWindowsClass thành chỉ ShellWindows và có vẻ như nó đang hoạt động. Cảm ơn tất cả! –

1

Các GetForegroundWindow là một hàm Win32 API và sử dụng nó, bạn cần phải nhập nó như đã giải thích ở đây: getforegroundwindow (user32)

shell32 được mô tả ở đây:

working with shell 32 in C#

Cuối cùng, tôi không biết nhiệm vụ của bạn, nhưng thường là nếu cần phải chọn một số tệp và có quyền truy cập vào bộ sưu tập này, nó là cần thiết để sử dụng số điện thoại FileOpenDialog

+0

Nhờ sự giúp đỡ của bạn, tôi đã có chương trình biên dịch, nhưng nó dường như không hoạt động. Trong thực tế, tôi tự hỏi làm thế nào có thể nó? Khi tôi nhận được cửa sổ Foreground, điều đó sẽ không trả về tay cầm của cửa sổ nơi chương trình của tôi đang chạy thay vì cửa sổ nơi Windows Explorer có danh sách các tệp đã chọn của tôi không? –

+0

Phương thức GetForegroundWindow lấy một tay cầm đến cửa sổ nền trước (cửa sổ mà người dùng hiện đang làm việc). Vì vậy, tôi không biết làm thế nào ứng dụng của bạn là nghĩa vụ phải làm việc. Nếu bạn cần liệt kê tất cả các cửa sổ, vui lòng tham khảo dự án http://www.codeproject.com/Articles/2286/Window-Hiding-with-C. – platon