如何显示“发送至”和“打开方式”上下文菜单?

时间:2010-01-11 08:38:05

标签: windows delphi winapi windows-shell

前段时间我问过how to pop up the Windows context (right-click) menu for a certain file in Delphi。但是,即使一切正常(几乎)正常,“发送到...”和“打开...”子菜单也没有任何项目,即使我在资源管理器中右键单击相同的文件名时也是如此工作还行。 (例如,'发送到...'有'桌面(创建截图)','电子邮件收件人'等。)

如何显示这些菜单?

1 个答案:

答案 0 :(得分:4)

几年前Raymond Chen在很多关于托管上下文菜单的系列文章中写到了这个确切的问题。他的文章的关键主题是,当您阅读文档时,您必须记住您的程序正在扮演shell的一部分,而文档通常是从实现它的代码的角度编写的。上下文菜单接口,而不是调用它们的代码。

早在part 2,Chen就发现send-to和open-with菜单显示为空。 Part 5解决了您对这些子菜单的直接关注。答案是您需要处理菜单消息。有一个与您的菜单相关联的窗口句柄 - 您提供给TrackPopupMenuEx的句柄(Issam's answer HND中提到的问题)。当菜单处于活动状态时,该窗口将接收消息,并且需要将它们转发到实现菜单命令的对象。该窗口有一个窗口过程,您需要调用菜单界面的HandleMenuMsgHandleMenuMsg2方法。这篇文章有一个例子。

文章系列的其他部分涵盖了当您说菜单“几乎”有效时,您无疑会提到的其他内容。 Part 3讨论了属性对话框的显示位置。 Part 7关于调用默认动词。我建议你阅读整个系列。不要害怕C ++中的所有内容;它几乎都是所有的接口方法和API函数,因此它应该毫不费力地转换为Delphi。