2017-07-05 6 views
1

別のアプリケーションで作成された標準のOpenFileDialogウィンドウから、選択したファイルとフォルダのパスを取得しようとしています。OpenFileDialog Spy

私はそれがWindowsエクスプローラでこのタスクを実行することが可能である見てきました:

IntPtr handle = GetOpenFileDialogHwnd(); 

ArrayList selected = new ArrayList(); 
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); 
     } 
    } 
} 

しかし、SHDocVw.ShellWindows()メソッドは、openFileDialog開かれたHWNDを返しません。

var view = Shell32.ShellFolderViewDual2.FromHwnd(hwnd); 

任意の別の方法があります:WindowsエクスプローラはOpenFileDialogに非常に似ているとして、私のようなShell32.IShellFolderViewDual2インターフェイスのためにOpenFileDialogのHWNDを持つキャストを行うにはいくつかの方法があります想像しますか?

目的は簡単です。標準のOpenFileDialogウィンドウで使用されるファイルのログを作成します。 Windows 7,8,10で動作可能です。

私は知っている、非常に非常に奇妙なことです。

編集:

Inspect.exe私に希望を与える:それはShellWindowsリストに表示されませんので、ファイルを開くダイアログを

enter image description here

答えて

1

は、シェルウィンドウではありません。

send the undocumented WM_GETISHELLBROWSER (WM_USER+7) message to the dialog windowでも可能ですが、返されるIShellBrowserポインタは同じプロセス内でのみ有効です。別のプロセスでこれを使用すると、アクセス違反が発生します。

IShellBrowserを取得したら、get other interfaces like IShellView or IFolderView2にアクセスできます。選択するには、IFolderView2 :: GetSelectionを使用します。

プロキシDLLをターゲットプロセスに挿入してファイルダイアログを制御することはできますが、C#でDLLを書き込むことはできません。