前段时间我询问如何在 Delphi 中为某个文件弹出 Windows 上下文(右键单击)菜单。但是,即使一切正常(几乎)正常,“发送到...”和“打开方式...”子菜单也没有任何项目,即使当我在资源管理器中右键单击相同的文件名时,它们工作正常。(例如,“发送至...”有“桌面(创建快照)”、“电子邮件收件人”等)。
我怎样才能让这些菜单出现?
前段时间我询问如何在 Delphi 中为某个文件弹出 Windows 上下文(右键单击)菜单。但是,即使一切正常(几乎)正常,“发送到...”和“打开方式...”子菜单也没有任何项目,即使当我在资源管理器中右键单击相同的文件名时,它们工作正常。(例如,“发送至...”有“桌面(创建快照)”、“电子邮件收件人”等)。
我怎样才能让这些菜单出现?
几年前,Raymond Chen 在关于托管上下文菜单的多部分系列文章中写到了这个精确的问题。他的文章的关键主题是,当您阅读文档时,您必须记住您的程序正在扮演 shell 的角色,而文档通常是从实现上下文菜单接口的代码的角度编写的,而不是到调用它们的代码。
早在第 2 部分,Chen 就观察到“发送至”和“打开方式”菜单显示为空。第 5 部分解决了您对这些子菜单的直接关注。答案是您需要处理菜单消息。有一个与您的菜单关联的窗口句柄 - 您提供给的句柄TrackPopupMenuEx
(HND
在Issam对您问题的回答中)。该窗口将在菜单处于活动状态时接收消息,并且需要将它们转发给实现菜单命令的对象。窗口有一个窗口过程,这就是你需要调用菜单接口HandleMenuMsg
和HandleMenuMsg2
方法的地方。文章有一个例子。
文章系列的其他部分涵盖了当您说您的菜单“几乎”有效时毫无疑问提到的其他内容。第 3 部分讨论了属性对话框出现的位置。第 7 部分关于调用默认动词。我建议你阅读整个系列。不要害怕一切都在 C++ 中;几乎都是接口方法和API函数,所以翻译成Delphi应该不会很麻烦。