2017-07-05 24 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()方法不返回打開打開文件對話框HWND。 Windows資源管理器非常相似,打開文件對話框,我想有一些辦法做到有打開文件對話框的HWND鑄像的Shell32.IShellFolderViewDual2接口:

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

有沒有什麼替代方式?

目標很簡單,就是在標準OpenFileDialog窗口中使用文件的日誌。可以在Windows 7,8,10中工作。

我知道,這似乎是一件非常非常非常奇怪的事情。

編輯:

Inspect.exe給我希望:

enter image description here

回答

1

的打開文件對話框不是一個shell窗口,這樣就不會在ShellWindows列表中顯示出來。

您可以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。