2013-09-30 14 views
8

seçilen dosyaların listesini alın. Gereksinim, geçerli seçimi aktif gezgin penceresinden veya Masaüstünden alabilmem gerektiğidir.Windows Masaüstü ve Explorer, Windows seçilen dosyaların bir listesini almak için çalışıyorum, Windows Desktop

Ben çevrimiçi kaynaklara geçiyor sonra bir araya Aşağıdaki kodu söndürmeyi başardık, ancak Masaüstü seçilen öğelerin listesini sağlamaz. Bunun dışında

ArrayList selected = new ArrayList(); 
var shell = new Shell32.Shell(); 
IntPtr handle = IntPtr.Zero; 
handle = GetForegroundWindow(); 
int intHandle = handle.ToInt32(); 

//For each explorer 
foreach (InternetExplorer window in new ShellWindowsClass()) 
{ 

    if (window.HWND == (int)handle) 
    { 
     Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
     foreach (Shell32.FolderItem item in items) 
     { 
      selected.Add(item.Path); 
     } 
    } 
} 

, şu ancak Masaüstü görmezden sadece tüm açık kaşif pencerelerde seçilen tüm öğelerin bir listesini verir çalıştı.

string filename; = Path.GetFileNameWithoutExtension(window.FullName).ToLower(); 
if (filename.ToLowerInvariant() == "explorer") 
{ 
    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
    foreach (Shell32.FolderItem item in items) 
    { 
     //MessageBox.Show(item.Path.ToString()); 
     selected.Add(item.Path); 
    } 
} 

Yani sadece her zaman kaşif pencerelerinden bir liste ile bitirmek ve hiçbir kaşif pencereler açık olduğunda bile hiçbir sonuç almak. Mevcut teknikler, Masaüstünü tamamen görmezden geliyor gibi görünüyor. Birisi şu anda etkin pencere/masaüstü seçilen dosyaların bir listesini almak için bana yardım edebilir misiniz

bunu takdir gerçekten olacaktır.

Teşekkür ederiz. sadece doğru kolu bulmak hala liste görünümü olduğu için

+0

masaüstünde dosya (lar) seçili olsun misiniz? Eğer evetse, bunu nasıl yapacağımı söyleyebilir misin? Lütfen! – GSP

cevap

1

Bu masaüstü için kolaydır. liste görünümü, masaüstü tanıtıcısının bir alt öğesidir.

Desktop 
+- Progman (for backward compatibility) 
    +- Shell Def View 
     +- SysListView32 (even under 64 bit) 

o zaman liste görünümde tüm liste görünümü işlemleri yapabilirsiniz. ancak diğer gezgin pencereleri liste görünümü içermez. Bunun yerine, çoğu kişi için bir gizem olan DirectUIHWND sınıfıyla pencere kullanıyorlar. Bu gizemi çözmenin bir yolunu açıklayan bir yazı buldum.

http://smartbear.com/forums?forumid=81&threadid=68427#68428

ben yardımcı olur.

0

Süreçler arasında iletişim kurmanız gerektiğini düşünüyorum. Aşağıdaki konular yardımcı olacaktır.

Bu

masaüstünden simgeleri alınırken bir örnektir. Masaüstü öğelerinin listesi ve mevcut konumları getirilir. http://social.msdn.microsoft.com/Forums/windows/en-US/d7df8a4d-fc0f-4b62-80c9-7768756456e6/how-can-i-get-desktops-icons-information-?forum=winforms

Burada LVM_GETITEMSTATE parametresi yukarıdaki bağlantıdan örnek kod içinde kullanılabilir. http://msdn.microsoft.com/en-us/library/windows/desktop/bb761053(v=vs.85).aspx

İyi şanslar ..

1
using System.Runtime.InteropServices; 

    public class ShellItems 
    { 
     [StructLayoutAttribute(LayoutKind.Sequential)] 
     private struct LVITEM 
     { 
      public uint mask; 
      public int iItem; 
      public int iSubItem; 
      public uint state; 
      public uint stateMask; 
      public IntPtr pszText; 
      public int cchTextMax; 
      public int iImage; 
      public IntPtr lParam; 
     } 

     const int LVM_FIRST = 0x1000; 
     const int LVM_GETSELECTEDCOUNT = 4146; 
     const int LVM_GETNEXTITEM = LVM_FIRST + 12; 
     const int LVNI_SELECTED = 2; 
     const int LVM_GETITEMCOUNT = LVM_FIRST + 4; 
     const int LVM_GETITEM = LVM_FIRST + 75; 
     const int LVIF_TEXT = 0x0001; 

     [DllImport("user32.dll", EntryPoint = "GetShellWindow")] 
     public static extern System.IntPtr GetShellWindow(); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 

     [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] 
     public static extern int SendMessagePtr(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

     [DllImport("User32.DLL")] 
     public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 


     public int SelectedItemCount 
     { 
      get 
      { 
       return SendMessage(ShellListViewHandle, LVM_GETSELECTEDCOUNT, IntPtr.Zero.ToInt32(), IntPtr.Zero.ToInt32()); 
      } 
     } 
     public int Count 
     { 
      get 
      { 
       return SendMessage(ShellListViewHandle, LVM_GETITEMCOUNT, IntPtr.Zero.ToInt32(), IntPtr.Zero.ToInt32()); 
      } 
     } 
     public string GetItemText(int idx) 
     { 
      // Declare and populate the LVITEM structure 
      LVITEM lvi = new LVITEM(); 
      lvi.mask = LVIF_TEXT; 
      lvi.cchTextMax = 512; 
      lvi.iItem = idx;   // the zero-based index of the ListView item 
      lvi.iSubItem = 0;   // the one-based index of the subitem, or 0 if this 
      // structure refers to an item rather than a subitem 
      lvi.pszText = Marshal.AllocHGlobal(512); 

      // Send the LVM_GETITEM message to fill the LVITEM structure 
      IntPtr ptrLvi = Marshal.AllocHGlobal(Marshal.SizeOf(lvi)); 
      Marshal.StructureToPtr(lvi, ptrLvi, false); 
      try 
      { 
       SendMessagePtr(ShellListViewHandle, LVM_GETITEM, IntPtr.Zero, ptrLvi); 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.Message); 
      } 

      // Extract the text of the specified item 
      string itemText = Marshal.PtrToStringAuto(lvi.pszText); 
      return itemText; 
     } 

     IntPtr ShellListViewHandle 
     { 
      get 
      { 
       IntPtr _ProgMan = GetShellWindow(); 
       IntPtr _SHELLDLL_DefViewParent = _ProgMan; 
       IntPtr _SHELLDLL_DefView = FindWindowEx(_ProgMan, IntPtr.Zero, "SHELLDLL_DefView", null); 
       IntPtr _SysListView32 = FindWindowEx(_SHELLDLL_DefView, IntPtr.Zero, "SysListView32", "FolderView"); 
       return _SysListView32; 
      } 
     } 

     public int GetSelectedItemIndex(int iPos = -1) 
     { 
      return SendMessage(ShellListViewHandle, LVM_GETNEXTITEM, iPos, LVNI_SELECTED); 
     } 
    } 
+1

Öğe sayısını ve seçilen öğe sayısını döndürür, ancak GetItemText üzerinde herhangi bir fikir çöküyor? –