Delphi 如何在另一个应用程序中以编程方式选择上下文菜单项?

Delphi 如何在另一个应用程序中以编程方式选择上下文菜单项?,delphi,winapi,contextmenu,messages,sendmessage,Delphi,Winapi,Contextmenu,Messages,Sendmessage,目标应用程序是用Delphi(win32而非.NET)编写的,并且是封闭源代码 我想调用的操作称为复制,但没有明显的键盘快捷键。(Ctrl+Insert做了错误的事情,而Ctrl+C什么也不做) 我可以找到我的目标HWND,并说服它打开上下文菜单(它响应WM\u RBUTTONDOWN/UP而不是WM\u CONTEXTMENU)。从菜单HWND中,我甚至可以通过MN_GETHMENU获得菜单句柄并找到我想要的菜单项。我只是不知道如何“选择”这个项目的细节。菜单是“无模式”的,也就是说,它的HW

目标应用程序是用Delphi(win32而非.NET)编写的,并且是封闭源代码

我想调用的操作称为复制,但没有明显的键盘快捷键。(Ctrl+Insert做了错误的事情,而Ctrl+C什么也不做)

我可以找到我的目标
HWND
,并说服它打开上下文菜单(它响应
WM\u RBUTTONDOWN/UP
而不是
WM\u CONTEXTMENU
)。从菜单
HWND
中,我甚至可以通过
MN_GETHMENU
获得菜单句柄并找到我想要的菜单项。我只是不知道如何“选择”这个项目的细节。菜单是“无模式”的,也就是说,它的
HWND
没有所有者,所以我不知道许多隐藏的
TPUtilWindow
窗口中的哪个是真正的所有者-否则我可能只发送一个
WM_命令
,甚至不弹出菜单,这会更好

尽管我确信它会促进各种各样的黑客行为,但我还是不愿意将代码注入目标进程


任何语言都可以接受答案。

显然,你可以发送WM_RBUTTONDOWN/UP
消息,它会做出响应。如果是,您是否也可以发送
WM_KEYDOWN/UP
消息?只要你知道菜单的结构并且没有改变,试着告诉应用程序有人按了下箭头X多次,然后按ENTER键。对我来说,这似乎是最简单的解决方案…

我觉得如果可能的话,可能会有一些安全隐患,因为这意味着你可以愚弄应用程序,让它们以为它们是从键盘/鼠标获得输入,而实际上它是从另一个应用程序获得的!现在想不出任何具体的例子…如果你运行的是不受信任的应用程序,你已经丢失了。但这引出了一个问题-这在XP上有效。。。我想知道它是否能在Vista/7上工作?谢谢,这很有效,不过为了简单起见,我发送了WM_CHAR而不是WM_KEYDOWN/UP。另外,我只发送了加速键,而不是光标down/enter。