2011-11-28 16 views
7

Windows Gezgini'nde C# uygulamasından şu anda seçili dosyaların bir listesini almak mümkün mü?Geçerli seçimi WindowsExplorer'da bir C# uygulamasından edinme?

Windows Gezgini'yle C# gibi yönetilen bir dilden etkileşimde bulunmanın farklı yöntemleri üzerinde çok fazla araştırma yaptım. Başlangıçta, kabuk uzantıları (örneğin, here ve here) uygulamalarına bakıyordum, ama görünüşe göre bu yönetilen kodun içinden kötü bir fikir ve muhtemelen benim durumum için çok fazla. ,

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     string filename; 
     ArrayList windows = new ArrayList(); 

     foreach(SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); 
      if(filename.Equals("explorer")) 
      { 
       Console.WriteLine("Hard Drive: {0}", ie.LocationURL); 
       windows.Add(ie); 

       var shell = new Shell32.Shell(); 
       foreach (SHDocVw.InternetExplorerMedium sw in shell.Windows()) 
       { 
        Console.WriteLine(sw.LocationURL); 
       } 

      } 
     } 

... Ama bireysel InternetExplorer nesneler geçerli dosya seçimi almak için hiçbir yöntemleri var:

Sonraki, ben PInvoke/COM çözümleri içine baktı ve bu kodun götürdü hangi this article bulundu Pencereyle ilgili bilgi almak için kullanılabilirler.

Daha sonra tam ihtiyacım olanı C++ 'da this article buldum. Bunu bir başlangıç ​​noktası olarak kullanarak, projemde referans olarak shell32.dll ekleyerek bazı çeviri yapmayı denedim. Ben ile sona erdi aşağıdadır:

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     string filename; 
     ArrayList windows = new ArrayList(); 

     foreach(SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); 
      if(filename.Equals("explorer")) 
      { 
       Console.WriteLine("Hard Drive: {0}", ie.LocationURL); 
       windows.Add(ie); 
       var shell = (Shell32.IShellDispatch4)new Shell32.Shell(); 
       Shell32.Folder folder = shell.NameSpace(ie.LocationURL); 
       Shell32.FolderItems items = folder.Items(); 
       foreach (Shell32.FolderItem item in items) 
       { 
        ... 
       } 
      } 
     } 

ben pencere için bir Folder nesne almak ve her öğe için mümkün çünkü bu, biraz daha yakın, ama hala geçerli seçimi almak için bir yol göremiyorum .

Tamamen yanlış yere bakıyor olabilirim, ama sahip olduğum tek ipuçlarını takip ediyorum. Beni uygun PInvoke/COM çözümüne yönlendiren var mı?

cevap

7

Sonunda bu soruya bir çözüm bulduk: Get selected items of folder with WinAPI.

IntPtr handle = GetForegroundWindow(); 

List<string> selected = new List<string>(); 
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); 
     } 
    } 
} 

Görünüşe window.Document çok kolay değildir tarayıcı penceresinden, içinde gerçek klasör görünümü karşılık gelir:

Şu anda seçili dosyaların listesini almak için, aşağıdaki ile sona erdi. Ancak yanıltıcı değişken/yöntem isimleri dışında, bu mükemmel çalışır.

İlgili konular