c# - Windows shell 扩展 : context menu when more than 16 files are selected

标签 c# c++ windows shell

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) 但没有找到解决办法。 谁能帮帮我?

最佳答案

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

在调用动词的情况下(即调用 IContextMenu::Invoke),有两种可能的路径:

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

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

如果您从不调用菜单项,那么您将永远不会使用完整的项目列表第二次调用 IShellExt::Initialize

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

关于c# - Windows shell 扩展 : context menu when more than 16 files are selected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370844/

相关文章:

linux - pdf = rs.getBytes ("pdf");它在 Windows 操作系统中不起作用。从 postgres bytea 字段读取二进制数据的替代方法是什么

c# - Windows 窗体中列表框内的复选框

c# - Gridview刷新问题

c# - 无法在WPF MVVM应用程序中找到xaml页面

C++ 并行化库 : OpenMP vs. 线程构建 block

c++ - QAbstractTableModel headerData 移除表头

c# - 如何在 asp.net 中的数据列表之间添加分隔符?

C# 接收数据的问题

c++ - `std::set` 在每种情况下都会对元素进行排序吗?

c++ - 知道路径是指 C++ 中的文件夹还是文件的最便宜的方法是什么?