65.9K
CodeProject 正在变化。 阅读更多。
Home

实现 IShellBrowser 以托管 IShellView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (22投票s)

2001年6月5日

CPOL

2分钟阅读

viewsIcon

331567

downloadIcon

4394

模仿 Windows Explorer

Sample Image - screen.gif

引言

我想知道如何模拟 Windows 资源管理器中的文件列表视图。 这就是我发现的。 它可能对某些人有用。 如果你创建一个简单的列表视图控件并用文件/文件夹填充它,你会注意到你不能

  • 轻松检测用户查看列表时对文件所做的更改(重命名、删除、复制/移动等)
  • 如果你尝试对你的项目使用 shell 的菜单,则 *发送到* 菜单不会被填充
  • 似乎没有办法获取 shellview 中使用的列名(文件名、大小、所有者、时间以及许多其他名称)

我发现 Windows 资源管理器和文件打开对话框公开了 IShellBrowserIShellFolder/IShellView 使用它来创建文件列表视图。 因此,我用 WTL 创建了一个简单的应用程序。 实现了基本的 IShellBrowser 方法并通过 IShellFolder::CreateViewObject 将其暴露给 IShellView。 最后,要创建列表视图,我调用了 IShellView::CreateViewWindow。 我没有尝试合并菜单。
我无法完成的事情

  • 工具栏按钮(它们被添加到我的工具栏中,但位图被搞砸了)。 但是,它们确实可以工作。
  • 对我来说最重要的是,我无法轻松检测到用户何时想要打开/浏览/搜索所选文件夹,以便我可以同步文件树。

IShellBrowser::BrowseObject 甚至从未被调用过,所以我没有实现它,但应该实现它,因为大多数 NSE 都使用此方法。 我确实发现 shellview 发送 WM_DDE* 消息,如果你正确响应,你将获得有关用户所采取操作的信息。 需要的消息是 WM_DDE_INITIATEWM_DDE_EXECUTEWM_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_DETAILSFWF_SNAPTOGRID 组合
  • 可以支持 ICommDlgBrowser 以拥有像在通用文件对话框中那样的简单列表视图(没有 webview)
  • 不要将你的可执行文件命名为 explorer.exe,否则会发生不愉快的事情

有用链接

免责声明:此代码和信息“按原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性和/或适用于特定用途的暗示保证。
© . All rights reserved.