Delphi XE应用程序如何在另一个应用程序窗口中显示弹出菜单?这个想法适用于在后台运行的辅助类型应用程序。在注册的热键上,应用程序需要在文本插入符号或鼠标光标附近显示一个弹出菜单。
这是常见的应用程序,这是由AutoHotkey创建并在文本编辑器中显示的菜单:
我想我的问题是:如何在任意屏幕位置显示弹出菜单,如果没有附加到Delphi控件?
答案 0 :(得分:3)
使用适当的菜单项创建TPopupMenu
。当您需要显示它时,只需调用Popup
通过屏幕坐标中的左上角位置。
PopupMenu1.Popup(X, Y);
答案 1 :(得分:2)
让我们举一个你给出的例子:用户正在运行一些arbirary应用程序,你希望能够检测到一个热键,显示一个菜单,然后根据所选的菜单项进行一些操作(甚至可能是用户的上下文,例如光标下的单词)。这比在任意屏幕坐标处显示菜单更复杂。
我的建议是使用AutoHotKey而不是尝试用其他编程语言复制它。如果您不知道这一点,您的代码可能会运行AutoHotKey脚本。 IIRC,您可以编译AHK脚本,因此您不需要安装AHK,只需要编译脚本。 AHK可能不是最优雅的解决方案,但它具有深度和成熟度。
如果这不可行,那么我建议你研究Windows Hooks和DLL Injection。除非你能找到一些预先存在的代码或框架,否则这将需要相当多的工作。
这种复杂性的原因是什么?要平滑地增加另一个程序(不会遇到焦点问题等),您希望将代码作为其他程序的一部分运行。这种机制可以通过DLL注入完成。然而,这只是第一步。一旦您的代码在正确的上下文中运行,那么您的代码必须与“主机”程序互操作。这可能很棘手(如果您对Windows消息传递和Windows API有丰富的经验,这会有所帮助)。如果你想让它与任意程序一起顺利运行,那就更难了。