我试图从另一个应用程序创建的标准OpenFileDialog窗口中捕获所选文件和文件夹的路径。
我已经看到在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。由于windows非常类似于OpenFileDialog,我想有一些方法可以为Shell32.IShellFolderViewDual 2接口提供OpenFileDialog的hwnd,如下所示:
var view = Shell32.ShellFolderViewDual2.FromHwnd(hwnd);还有别的办法吗?
目标很简单,可以记录标准OpenFileDialog窗口中使用的文件。适用于Windows 7,8,10。
我知道这似乎是件很奇怪的事。
编辑:
Inspect.exe给了我希望:

发布于 2017-07-06 20:33:15
打开的文件对话框不是shell窗口,因此它不会出现在ShellWindows列表中。
您可以USER+7)到对话框窗口的消息,但返回的IShellBrowser指针仅在同一进程中有效。在另一个进程中使用它会导致访问冲突。
一旦你得到了IShellBrowser,你就可以获取其他接口,如IShellView或IFolderView2了。对于选择,您需要使用IFolderView2 2::GetSelection。
可以将代理DLL注入目标进程以控制文件对话框,但不能在C#中写入DLL。
https://stackoverflow.com/questions/44931728
复制相似问题