2013-09-30 6 views
8

Я пытаюсь получить список выбранных файлов из Windows Desktop и Windows Explorer. Требование состоит в том, чтобы я мог получить текущий выбор из окна активного проводника или рабочего стола.Получить список выбранных файлов из Windows 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); 
     } 
    } 
} 

Кроме того, я попытался следующие, но это только дает список всех выбранных элементов во всех открытых окнах проводника, игнорируя при этом рабочий стол.

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

Так что я просто всегда в конечном итоге со списком из Проводника и не получить никаких результатов, даже если нет проводниковая окна открыты. Существующие методы, похоже, вообще игнорируют Рабочий стол.

Я был бы очень признателен, если бы кто-то мог помочь мне получить список выбранных файлов из текущего активного окна/рабочего стола.

Thank you.

+0

Не могли бы вы получить выбранный файл (ы) на рабочем столе? Если да, не могли бы вы рассказать мне, как это сделать? Пожалуйста! – GSP

ответ

1

Это просто для рабочего стола, так как оно по-прежнему является списком, просто найдите правильную ручку. list list - это дочерний элемент дескриптора рабочего стола.

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

, то вы можете выполнять все операции listview в виде списка. но в других окнах проводника нет списка. Вместо этого они используют окно с классом DirectUIHWND, что является загадкой для многих. Я только что нашел сообщение, которое описывает способ разгадать эту тайну.

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

Я надеюсь, что это помогает.

0

Я думаю, вам следует установить связь между процессами. Следующие темы помогут.

Это пример извлечения значков с рабочего стола. Выбирается список элементов рабочего стола и их текущие позиции. http://social.msdn.microsoft.com/Forums/windows/en-US/d7df8a4d-fc0f-4b62-80c9-7768756456e6/how-can-i-get-desktops-icons-information-?forum=winforms

Здесь параметр LVM_GETITEMSTATE может использоваться в коде примера из приведенной выше ссылки. http://msdn.microsoft.com/en-us/library/windows/desktop/bb761053(v=vs.85).aspx

Успехов ..

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

Он возвращает количество элементов и количество выбранных элементов, но падает на GetItemText, любая идея? –