2013-09-30 9 views
8

से चयनित फ़ाइलों की सूची प्राप्त करें मैं विंडोज डेस्कटॉप और एक्सप्लोरर विंडोज से चयनित फ़ाइलों की एक सूची प्राप्त करने का प्रयास कर रहा हूं। आवश्यकता यह है कि मैं सक्रिय एक्सप्लोरर विंडो या डेस्कटॉप से ​​वर्तमान चयन को पुनर्प्राप्त करने में सक्षम होना चाहिए।विंडोज डेस्कटॉप

ऑनलाइन संसाधनों के माध्यम से जाने के बाद, मैंने निम्नलिखित कोड को एक साथ रखा है, लेकिन यह डेस्कटॉप से ​​चयनित आइटमों की एक सूची प्रदान नहीं करता है।

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

उसके अलावा, मैं निम्नलिखित लेकिन यह सिर्फ डेस्कटॉप को अनदेखा करते हुए सभी खुले Explorer विंडो में सभी चयनित तत्वों की सूची देता है की कोशिश की।

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

तो मैं सिर्फ हमेशा ऊपर एक्सप्लोरर खिड़कियों से एक सूची के साथ समाप्त करने और कोई परिणाम नहीं भी मिलता है जब कोई एक्सप्लोरर विंडो खुली होती हैं। वर्तमान तकनीक डेस्कटॉप को पूरी तरह से अनदेखा कर रही है।

अगर मैं वर्तमान में सक्रिय विंडो/डेस्कटॉप से ​​चयनित फ़ाइलों की सूची प्राप्त करने में मेरी मदद कर सकता हूं तो मैं वास्तव में इसकी सराहना करता हूं।

धन्यवाद।

+0

आप डेस्कटॉप पर फ़ाइल (फ़ाइलें) चयनित हो सकते हैं? यदि हां, तो क्या आप मुझे बता सकते हैं कि ऐसा कैसे करें? कृप्या! – GSP

उत्तर

1

डेस्कटॉप के लिए यह आसान है क्योंकि यह अभी भी एक सूचीदृश्य है, बस सही हैंडल ढूंढें। सूची दृश्य डेस्कटॉप हैंडल का एक बच्चा है।

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

तो आप सूची दृश्य पर सभी सूचीदृश्य संचालन कर सकते हैं। लेकिन अन्य एक्सप्लोरर विंडो में सूची दृश्य नहीं है। इसके बजाए वे कक्षा 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 पर क्रैश, कोई विचार? –

संबंधित मुद्दे