【问题标题】:How do you handle rename operations when calling IContextMenu?调用 IContextMenu 时如何处理重命名操作?
【发布时间】:2016-11-08 22:23:23
【问题描述】:

我用CMF_CANRENAME 调用IContextMenu::QueryContextMenu,在Windows XP 上调用IContextMenu::InvokeCommand 时处理重命名操作时遇到问题。

我不是命名空间扩展,也没有使用 DefView/IShellView,但我提供了一个实现 IServiceProvider 的站点。

在较新版本的 Windows 上,我被询问是否有实现 IFolderView2 的服务,并且 shell 调用 IFolderView2::DoRename,我可以开始重命名操作。

但在 Windows XP 上,它会查询 SID_DefView 服务,但我找不到任何关于我应该如何实现该服务的信息。

它 (SHELL32!CDefFolderMenu::_ProcessRename) 要求的接口是 {985F64F0-D410-4E02-BE22-DA07F2B5C5E1},我可以在注册表中看到这是 IDefViewFrame3 的 IID,但它似乎是无证!另一方面,IDefViewFrame 已记录在案,但 MSDN 唯一说的是“仅用于其 IUnknown 功能。它没有自己的方法。”。

在这种情况下,是否有记录在案的方式来处理 XP 上的重命名操作?

我真的不想伪造一个 IDefViewFrame3 接口,但我能想到的唯一其他选择是查看它是否是重命名动词,然后在 TrackPopupMenu 之后自己处理它。

【问题讨论】:

  • 考虑你是否真的需要支持 XP。
  • 如果我没看错你的问题,其他一些代码要求你的代码执行重命名操作,而你在内部使用 shell 上下文菜单来执行实际的重命名。是对的吗?您是在问如何实现IDefViewFrame3 来接收初始重命名请求?
  • 实际重命名不需要TrackPopupMenu()。您只需QueryContextMenu() 用菜单项填充HMENU,然后找到Rename 菜单项并将其ID 传递给InvokeCommand()。或者直接跳过QueryContextMenu() 并将硬编码的"rename" 动词传递给InvokeCommand()
  • 顺便说一句,MSDN 在撒谎IDefViewFrame,它实际上定义了3 个方法,如shlobj.h - GetWindowLV()ReleaseWindowLV()GetShellFolder() 中所见。但是,这些都与执行 shell 操作无关。至于IDefViewFrame3,不仅没有文档,而且在Win32 SDK头文件的任何地方也没有声明,所以它很可能是MS内部使用的私有接口,不希望第三方开发者手动实现。
  • 这得到了 IID {985F64F0-D410-4E02-BE22-DA07F2B5C5E1} 的进一步支持,也与 IDefViewID 相关联,在其文档中具有相同的“仅用于其 IUnknown 功能”注释,并且未声明为不同的任何 Win32 SDK 标头中的接口,它只是 IUnknown#define 别名。

标签: windows winapi windows-shell shell-extensions


【解决方案1】:

在 Windows XP 上 IUnknown 后的 IDefViewFrame3 如下所示:

STDMETHOD(GetWindowLV)(THIS_ HWND*phwnd) PURE;
STDMETHOD(ShowHideListView)(THIS) PURE;
STDMETHOD(OnResizeListView)(THIS) PURE;
STDMETHOD(ReleaseWindowLV)(THIS) PURE;
STDMETHOD(DoRename)(THIS) PURE;

并且DoRenameInvokeCommand 内部的 DefView 调用,但由于它是如此晦涩且未记录,因此所有 3rd 方命名空间扩展都不太可能正确处理它,因此即使您实现 IDefViewFrame3 您仍然必须检查重命名InvokeCommand 失败时的动词。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2022-11-30
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多