2011-11-28 9 views
7

C#アプリケーションから現在Windowsエクスプローラで選択されているファイルのリストを取得できますか?C#アプリケーションからWindowsExplorerの現在の選択を取得しますか?

私はC#のような管理言語からWindowsエクスプローラとやり取りするさまざまな方法について多くの研究を行ってきました。最初は、シェル拡張の実装(例えばherehere)を見ていましたが、明らかにそれは管理コード内からは悪い考えであり、とにかく私の状況にとっては残酷かもしれません。

次は、私がの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を参考にして翻訳を試みました。私は窓のために、各項目についてFolderオブジェクトを取得することができていますので、これは、やや近かった

 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) 
       { 
        ... 
       } 
      } 
     } 

が、私はまだ現在の選択を取得する方法が表示されていない:私は次のようになってしまいました。

私は完全に間違った場所で見ているかもしれませんが、私は私が持っている唯一のリードに従っています。誰も私に適切な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は非常に直感的ではありませんエクスプローラウィンドウ、内部に実際のフォルダビューに対応しています。しかし、誤った変数/メソッド名以外にも、これは完全に機能します。

関連する問題