2013-09-30 19 views
8

Ich versuche, eine Liste ausgewählter Dateien aus dem Windows-Desktop und dem Explorer Windows zu erhalten. Die Anforderung ist, dass ich die aktuelle Auswahl aus dem aktiven Explorer-Fenster oder dem Desktop abrufen kann.Liste der ausgewählten Dateien von Windows Desktop

Ich habe es geschafft, den folgenden Code zusammenzustellen, nachdem ich Online-Ressourcen durchlaufen habe, aber es enthält keine Liste ausgewählter Elemente vom Desktop.

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); 
     } 
    } 
} 

Other than that, habe ich versucht, die folgenden, aber es gibt nur eine Liste aller ausgewählten Elemente in allen geöffneten Explorer-Fenster während des Desktop zu ignorieren.

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); 
    } 
} 

So habe ich am Ende mit einer Liste aus den Explorer-Fenstern nur immer und auch keine Ergebnisse erhalten, wenn keine Explorer-Fenster geöffnet sind. Die aktuellen Techniken scheinen den Desktop insgesamt zu ignorieren.

Ich würde es wirklich schätzen, wenn jemand mir helfen könnte, eine Liste ausgewählter Dateien vom aktuell aktiven Fenster/Desktop zu bekommen.

Vielen Dank.

+0

Könnten Sie Datei (en) auf dem Desktop erhalten ausgewählt? Wenn ja, könntest du mir sagen, wie ich das machen soll? Bitte! – GSP

Antwort

1

Es ist einfach für den Desktop, da es immer noch eine Listview ist, nur den richtigen Griff finden. Listenansicht ist ein Kind des Desktop-Handles.

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

Dann können Sie alle Listview-Operationen in der Listenansicht ausführen. Andere Explorer-Fenster enthalten jedoch keine Listenansicht. Stattdessen verwenden sie ein Fenster mit der Klasse DirectUIHWND, was für viele ein Rätsel ist. Ich habe gerade einen Beitrag gefunden, der einen Weg zur Entschlüsselung dieses Geheimnisses beschreibt.

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

Ich hoffe, es hilft.

0

Ich denke, Sie sollten zwischen den Prozessen kommunizieren. Folgende Themen helfen.

Dies ist ein Beispiel für das Abrufen von Symbolen vom Desktop. Liste der Desktop-Objekte und ihre aktuellen Positionen werden abgerufen. http://social.msdn.microsoft.com/Forums/windows/en-US/d7df8a4d-fc0f-4b62-80c9-7768756456e6/how-can-i-get-desktops-icons-information-?forum=winforms

Hier kann der Parameter LVM_GETITEMSTATE innerhalb des Beispielcodes aus dem obigen Link verwendet werden. http://msdn.microsoft.com/en-us/library/windows/desktop/bb761053(v=vs.85).aspx

Viel Glück ..

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

Es gibt die Anzahl der Elemente und die Anzahl der ausgewählten Elemente zurück, stürzt aber bei GetItemText ab. –