Get list of selected files from Windows Desktop
It is easy for desktop since it is still a listview, just find the correct handle. list view is a child of the desktop handle.
Desktop+- Progman (for backward compatibility) +- Shell Def View +- SysListView32 (even under 64 bit)
then you can do all listview operations on the list view. but other explorer windows does not contain a list view. Instead they use window with class DirectUIHWND
which is a mystery to many. I've just found a post that describes a way to the unravel that mystery.
http://smartbear.com/forums?forumid=81&threadid=68427#68428
I hope it helps.
I think you should communicate between processes.Following topics will help.
This is an example of retrieving icons from desktop. List of desktop items and their current positions are fetched.http://social.msdn.microsoft.com/Forums/windows/en-US/d7df8a4d-fc0f-4b62-80c9-7768756456e6/how-can-i-get-desktops-icons-information-?forum=winforms
Here the parameter LVM_GETITEMSTATE can be used within the sample code from the link above.http://msdn.microsoft.com/en-us/library/windows/desktop/bb761053(v=vs.85).aspx
Good luck..
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); } }