打开文件对话框间谍

OpenFileDialog Spy

我正在尝试从另一个应用程序创建的标准 OpenFileDialog window 中捕获选定文件和文件夹的路径。

我看到可以使用 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()方法没有return打开openFileDialog hwnd。由于 windows 资源管理器与 OpenFileDialog 非常相似,我想有一些方法可以为 Shell32.IShellFolderViewDual2 接口执行具有 OpenFileDialog hwnd 的转换,例如:

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

还有其他方法吗?

目标很简单,记录标准 OpenFileDialog windows 中使用的文件。适用于 Windows 7、8、10。

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

编辑:

Inspect.exe给我希望:

打开文件对话框不是 shell window,因此它不会出现在 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。