正如我所看到的,当选择了超过16个文件时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) 但那里找不到解决方案。 任何人都可以帮助我吗?
答案 0 :(得分:2)
在这种情况下,逻辑非常简单。当您右键单击最多16个项目时,将发送到IShellExt::Initialize
方法,然后是IContextMenu::QueryContextMenu
如果您的动词被调用(即调用IContextMenu::Invoke
),则有两种可能的路径:
选择中最多16个项目 - > IContextMenu::Invoke
被直接调用。
选择中超过16个项目,然后第二次使用所有选项的项目调用IShellExt::Initialize
方法,然后IContextMenu::Invoke
。
如果您从未调用过菜单项,那么您将永远不会使用完整的项目列表第二次调用IShellExt::Initialize
。
我有一个sample project on github创建一个简单的上下文菜单(使用C ++),它使用真正的低级OutputDebugString
来演示行为。