实现 IShellBrowser 以托管 IShellView






4.84/5 (22投票s)
模仿 Windows Explorer
引言
我想知道如何模拟 Windows 资源管理器中的文件列表视图。 这就是我发现的。 它可能对某些人有用。 如果你创建一个简单的列表视图控件并用文件/文件夹填充它,你会注意到你不能
- 轻松检测用户查看列表时对文件所做的更改(重命名、删除、复制/移动等)
- 如果你尝试对你的项目使用 shell 的菜单,则 *发送到* 菜单不会被填充
- 似乎没有办法获取 shellview 中使用的列名(文件名、大小、所有者、时间以及许多其他名称)
我发现 Windows 资源管理器和文件打开对话框公开了 IShellBrowser
,IShellFolder
/IShellView
使用它来创建文件列表视图。 因此,我用 WTL 创建了一个简单的应用程序。 实现了基本的 IShellBrowser
方法并通过 IShellFolder::CreateViewObject
将其暴露给 IShellView
。 最后,要创建列表视图,我调用了 IShellView::CreateViewWindow
。 我没有尝试合并菜单。
我无法完成的事情
- 工具栏按钮(它们被添加到我的工具栏中,但位图被搞砸了)。 但是,它们确实可以工作。
- 对我来说最重要的是,我无法轻松检测到用户何时想要打开/浏览/搜索所选文件夹,以便我可以同步文件树。
IShellBrowser::BrowseObject
甚至从未被调用过,所以我没有实现它,但应该实现它,因为大多数 NSE 都使用此方法。 我确实发现 shellview 发送 WM_DDE*
消息,如果你正确响应,你将获得有关用户所采取操作的信息。 需要的消息是 WM_DDE_INITIATE
、WM_DDE_EXECUTE
、WM_DDE_TERMINATE
。 WM_DDE_EXECUTE 将给你一个像这样的字符串
"[ViewFolder("C:\Documents and Settings\leon\Desktop\billing", :428:780, 1)]"。 我不知道 428:780 代表什么。 但 action 将是 ViewFolder/ExploreFolder/FindFolder。 如果 Microsoft 记录这些东西,我们就可以使用它,那就太好了。 但是按照目前的状况,他们甚至在 MSDN 中说
"您不直接实现此接口。 IShellBrowser
由 Windows 资源管理器和 Windows 文件打开通用对话框实现。"
但是,他们为什么要告诉我们 WM_GETISHELLBROWSER? 无论如何,也许它对某些人有用,所以就在这里。
一些有用的点
- 要在 shellview 中实现拖放功能,请调用
OleInitialize
/OleUninitialize
- 确保你正确响应 WM_GETISHELLBROWSER,否则 CreateView 可能会崩溃
- 详细信息列表视图似乎仅适用于
FVM_DETAILS
和FWF_SNAPTOGRID
组合 - 可以支持
ICommDlgBrowser
以拥有像在通用文件对话框中那样的简单列表视图(没有 webview) - 不要将你的可执行文件命名为 explorer.exe,否则会发生不愉快的事情
有用链接
- EnumDesk 用于枚举/导航文件夹/文件的示例(随 PSDK 提供)我在 C:\Program Files\Microsoft Platform SDK\Samples\WinUI\Shell 下找到了它
- Q157247 - PRB: IShellFolder::CreateViewObject() 导致访问冲突
- IShellBrowser
- IShellFolder
- IShellView
- Shell Objects 标头文件 (shlobj.h) 中的注释很有用