【问题标题】:Windows Shell extention: context menu when more than 16 files are selectedWindows Shell 扩展:选择超过 16 个文件时的上下文菜单
【发布时间】:2014-01-26 23:47:31
【问题描述】:

As I can see, when more than 16 files are selected DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);返回 16。 MSDN:http://msdn.microsoft.com/en-us/library/dd758093%28VS.85%29.aspx “在 Windows 7 及更高版本中,当查询快捷菜单时,传递给动词的项目数限制为 16。然后在调用该动词时重新创建并重新初始化该动词。”

但我的 FileContextMenuExt::Initialize 函数只被调用一次,即使我选择了超过 16 个文件。 (我使用输出到文本文件检查了它)。

如何获取所选文件的完整列表及其编号?

我的问题类似于Shell Extension: DragQueryFile returns at most 16 (in Windows 7) 但在那里没有找到解决方案。 谁能帮帮我?

【问题讨论】:

  • 你有什么问题?
  • 一旦您选择了您的操作,就会第二次调用初始化,但这次是完整列表?还是我阅读文档有误?
  • "但是我的 FileContextMenuExt::Initialize 函数只被调用一次,即使我选择了超过 16 个文件。(我使用输出到文本文件检查了它)。"
  • 只有在调用动词时才会重新初始化。
  • 你的意思是当我调用动词时,在动词实际起作用之前,shell 应该用完整的列表再次调用我的 Initialize 函数?但实际上,我的 Initialize 函数只被调用一次(Initialize 函数写入日志信息,其中包含 windows shell 提供给它的文件数,并且它始终小于或等于 16)。

标签: c# c++ windows shell


【解决方案1】:

在这种情况下,逻辑真的很简单。当您右键单击时,最多 16 个项目将被发送到 IShellExt::Initialize 方法,然后是 IContextMenu::QueryContextMenu

如果你的动词被调用(即IContextMenu::Invoke被调用),有两种可能的路径:

选择中最多包含 16 个项目 -> 直接调用 IContextMenu::Invoke

选择中的项目超过 16 个,然后第二次调用 IShellExt::Initialize 方法,其中 所有 选择的项目,然后是 IContextMenu::Invoke

如果您从不调用菜单项,那么您将永远无法获得第二次调用 IShellExt::Initialize 并获得完整的项目列表。

我有一个 sample project on github,它创建了一个简单的上下文菜单(使用 C++),它使用真正低级的 OutputDebugString 演示了行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2010-10-30
    • 2023-03-19
    相关资源
    最近更新 更多