首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenFileDialog间谍

OpenFileDialog间谍
EN

Stack Overflow用户
提问于 2017-07-05 16:38:46
回答 1查看 348关注 0票数 1

我试图从另一个应用程序创建的标准OpenFileDialog窗口中捕获所选文件和文件夹的路径。

我已经看到在windows资源管理器中执行此任务是可能的:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
var view = Shell32.ShellFolderViewDual2.FromHwnd(hwnd);

还有别的办法吗?

目标很简单,可以记录标准OpenFileDialog窗口中使用的文件。适用于Windows 7,8,10。

我知道这似乎是件很奇怪的事。

编辑:

Inspect.exe给了我希望:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 20:33:15

打开的文件对话框不是shell窗口,因此它不会出现在ShellWindows列表中。

您可以USER+7)到对话框窗口的消息,但返回的IShellBrowser指针仅在同一进程中有效。在另一个进程中使用它会导致访问冲突。

一旦你得到了IShellBrowser,你就可以获取其他接口,如IShellView或IFolderView2了。对于选择,您需要使用IFolderView2 2::GetSelection。

可以将代理DLL注入目标进程以控制文件对话框,但不能在C#中写入DLL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44931728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档