2011-11-28 4 views
7

क्या उन फ़ाइलों की सूची प्राप्त करना संभव है जो वर्तमान में विंडोज एक्सप्लोरर में मेरे सी # ऐप से चुने गए हैं?एक सी # आवेदन से WindowsExplorer में वर्तमान चयन प्राप्त करें?

मैंने विंडोज एक्सप्लोरर के साथ सी # जैसी प्रबंधित भाषा से बातचीत करने के विभिन्न तरीकों पर बहुत सारे शोध किए हैं। प्रारंभ में, मैं उदाहरण के लिए खोल एक्सटेंशन (here और here) के कार्यान्वयन को देख रहा था), लेकिन स्पष्ट रूप से यह प्रबंधित कोड के भीतर से एक बुरा विचार है, और शायद मेरी स्थिति के लिए शायद अधिक है।

इसके बाद, मैं PInvoke/COM समाधान में देखा, और this article पाया है, जो मुझे इस कोड को जन्म दिया:

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     string filename; 
     ArrayList windows = new ArrayList(); 

     foreach(SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); 
      if(filename.Equals("explorer")) 
      { 
       Console.WriteLine("Hard Drive: {0}", ie.LocationURL); 
       windows.Add(ie); 

       var shell = new Shell32.Shell(); 
       foreach (SHDocVw.InternetExplorerMedium sw in shell.Windows()) 
       { 
        Console.WriteLine(sw.LocationURL); 
       } 

      } 
     } 

... लेकिन अलग-अलग InternetExplorer वस्तुओं वर्तमान फ़ाइल चयन पाने के लिए कोई विधि नहीं है, हालांकि वे खिड़की के बारे में जानकारी प्राप्त करने के लिए इस्तेमाल किया जा सकता है।

तब मुझे this article मिला जो मुझे चाहिए, लेकिन सी ++ में। इसे शुरुआती बिंदु के रूप में उपयोग करते हुए, मैंने अपनी परियोजना में संदर्भ के रूप में shell32.dll जोड़कर कुछ अनुवाद करने का प्रयास किया। मैं के साथ समाप्त हो गया है:

 SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     string filename; 
     ArrayList windows = new ArrayList(); 

     foreach(SHDocVw.InternetExplorer ie in shellWindows) 
     { 
      filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); 
      if(filename.Equals("explorer")) 
      { 
       Console.WriteLine("Hard Drive: {0}", ie.LocationURL); 
       windows.Add(ie); 
       var shell = (Shell32.IShellDispatch4)new Shell32.Shell(); 
       Shell32.Folder folder = shell.NameSpace(ie.LocationURL); 
       Shell32.FolderItems items = folder.Items(); 
       foreach (Shell32.FolderItem item in items) 
       { 
        ... 
       } 
      } 
     } 

यह थोड़ा करीब थे, क्योंकि मैं प्रत्येक आइटम के लिए खिड़की के लिए एक Folder वस्तु प्राप्त करने के लिए, और सक्षम हूँ, लेकिन मैं अभी भी वर्तमान चयन पाने के लिए एक तरह से नहीं दिख रहा है ।

मैं पूरी तरह से गलत जगह पर देख रहा हूं, लेकिन मैं केवल एक ही लीड का पालन कर रहा हूं। क्या कोई मुझे उचित PInvoke/COM समाधान पर इंगित कर सकता है?

उत्तर

7

अंत में एक समाधान पता चला, इस प्रश्न के लिए धन्यवाद: Get selected items of folder with WinAPI

IntPtr handle = GetForegroundWindow(); 

List<string> selected = new List<string>(); 
var shell = new Shell32.Shell(); 
foreach(SHDocVw.InternetExplorer window in shell.Windows()) 
{ 
    if (window.HWND == (int)handle) 
    { 
     Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems(); 
     foreach(Shell32.FolderItem item in items) 
     { 
      selected.Add(item.Path); 
     } 
    } 
} 

जाहिर window.Document एक्सप्लोरर विंडो, जो बहुत सहज नहीं है अंदर वास्तविक फ़ोल्डर दृश्य से मेल खाती है:

मैं आदेश वर्तमान में चयनित फ़ाइलों की एक सूची प्राप्त करने के लिए निम्नलिखित के साथ समाप्त हो गया। लेकिन भ्रामक चर/विधि नामों के अलावा, यह पूरी तरह से काम करता है।