Windows 如何显示';发送至';和';用'打开;上下文菜单?

Windows 如何显示';发送至';和';用'打开;上下文菜单?,windows,delphi,winapi,windows-shell,Windows,Delphi,Winapi,Windows Shell,前段时间我问过你。但是,即使一切正常,“发送到…”和“打开时使用…”子菜单没有任何项,即使我在资源管理器中右键单击同一文件名,它们也正常工作。(例如,“发送到…”有“桌面(创建快照)”、“电子邮件收件人”等) 如何使这些菜单出现?几年前,雷蒙德·陈(Raymond Chen)在一系列关于托管上下文菜单的文章中提到了这个精确的问题。他的文章的关键主题是,当您阅读文档时,您必须记住您的程序是在扮演shell的角色,而文档通常是从实现上下文菜单接口的代码的角度编写的,而不是从调用它们的代码的角度编写的

前段时间我问过你。但是,即使一切正常,“发送到…”和“打开时使用…”子菜单没有任何项,即使我在资源管理器中右键单击同一文件名,它们也正常工作。(例如,“发送到…”有“桌面(创建快照)”、“电子邮件收件人”等)


如何使这些菜单出现?

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

早在年,陈就观察到“发送到”和“打开与”菜单显示为空。解决您对这些子菜单的直接关注。答案是您需要处理菜单消息。有一个与菜单相关联的窗口句柄-您提供给
TrackPopupMenuEx
HND
中的问题)的句柄。该窗口将在菜单处于活动状态时接收消息,它需要将消息转发给实现菜单命令的对象。该窗口有一个窗口过程,在这里您需要调用菜单界面的
HandleMenuMsg
HandleMenuMsg2
方法。这篇文章有一个例子

文章系列的其他部分涵盖了当你说你的菜单“几乎”有效时,你无疑提到的其他事情。讨论属性对话框的显示位置。这是关于调用默认动词的。我建议你阅读整个系列。不要害怕一切都在C++中;它几乎包含了所有的接口方法和API函数,因此应该可以轻松地将其转换为Delphi