打开文件对话框间谍
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。
我正在尝试从另一个应用程序创建的标准 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。