2

Delphi XE 应用程序如何在另一个应用程序的窗口中显示弹出菜单?这个想法是针对在后台运行的辅助类型应用程序。在注册的热键上,应用程序需要在文本插入符号或鼠标光标附近显示一个弹出菜单。

这样做的应用程序很常见,这是由AutoHotkey创建并显示在文本编辑器中的菜单:

附加到另一个应用程序窗口的弹出菜单

我想我要问的是:如何在任意屏幕位置显示弹出菜单,而不将其附加到 Delphi 控件?

4

2 回答 2

3

TPopupMenu使用适当的菜单项创建一个。当您需要显示它时,只需调用Popup屏幕坐标中的左上角位置即可。

PopupMenu1.Popup(X, Y);
于 2012-02-18T21:32:54.547 回答
2

@DavidHeffernan 回答了您的问题,但您可能没有提出正确的问题。

让我们以您给出的示例为例:用户正在运行一些任意应用程序,并且您希望能够检测热键,显示菜单,然后根据选择的菜单项(甚至可能是用户的上下文,例如作为光标下的单词)。这比简单地在任意屏幕坐标处显示菜单更复杂。

我的建议是使用 AutoHotKey 而不是尝试在其他编程语言中复制它。如果您不知道这一点,您的代码可能会运行 AutoHotKey 脚本。IIRC,你可以编译 AHK 脚本,所以你不需要安装 AHK,只需要编译的脚本。AHK 可能不是最优雅的解决方案,但它具有深度和成熟度。

如果这不可能,那么我建议您研究 Windows Hooks 和 DLL Injection。除非你能找到一些预先存在的代码或框架,否则这将需要相当多的工作。

这种复杂性的原因是什么?为了顺利地扩充另一个程序(不会遇到焦点问题等),您希望您的代码作为该其他程序的一部分运行。其机制可以通过 DLL 注入来完成。然而,这只是第一步。一旦您的代码在正确的上下文中运行,那么您的代码必须与“主机”程序互操作。这可能很棘手(如果您对 Windows 消息传递和 Windows API 有丰富的经验,这会有所帮助)。如果你想让它在任何任意程序上都能顺利运行,那就更难了。

于 2012-02-18T22:10:05.193 回答