【发布时间】:2020-03-24 07:19:45
【问题描述】:
我已经尝试解决这个问题好几个星期了。我正在尝试在 Delphi 中创建一个在后台运行并捕获任何热键并执行 Ctrl + c 的应用程序。所以我所做的就是抓住热键,例如 ALT + 右箭头,然后模拟 Ctrl + c 并将命令扔到当前窗口。
我注意到的是,当我尝试向 Firefox 发送命令时,如下所示:
SendMessage(FireFoxHandle, WM_COPY, 0, 0);
sleep(250);
CopiedText := ClipBoard.AsText;
复制成功,我得到了预期的文本。但是,一旦我将同一行代码用于 chrome(chrome_widget_1) 或记事本等其他窗口,我什么也得不到。所以我尝试的是获取chrome和记事本的子窗口并尝试将命令发送到子窗口。
将“Chrome 旧版窗口”作为“chrome_widget_1”窗口的子窗口,但是当我尝试在选项卡中选择文本时,模拟 Ctrl + c,仍然无法正常工作。
在 stackoverflow 中找到了一个示例,用于将 wm_copy 发送到记事本的子窗口,该编辑类似于以下代码:
ParentWindw := FindWindow('Notepad',nil);
if ParentWindow <> 0 then
begin
ChildWindow := FindWindowEx(ParentWindow, 0, 'Edit', nil);
SendMessage(ChildWindow, WM_COPY, 0, 0);
sleep(250);
CopiedText := ClipBoard.AsText;
end;
代码有效,但有什么动态方法可以确定我需要用于 wm_copy 命令的子窗口吗?我不仅要记事本窗口,还要要所有可以使用的窗口。
或者无论如何我可以在 Delphi 中以编程方式在任何窗口中复制突出显示的文本,特别是在 xe2 中?
我已经研究过 sendinput、keyevents 并尝试了它们,但没有运气。我已经没有办法让它工作了。
提前感谢您的帮助。
【问题讨论】:
-
不,没有动态方式。您需要了解每个特定应用程序。
-
系统中没有任何东西可以保证任意窗口都会响应该消息
-
你为什么要这么做?
-
@Olivier 嗨,因为我需要创建一个可以模拟 ctrl + c 的应用程序,在任何窗口中复制当前突出显示的文本。
-
同样,发送
WM_COPY消息是行不通的。也许您应该询问您的根本问题,而不是您提出的解决方案(这是行不通的)。
标签: google-chrome delphi delphi-xe2 notepad windows-messages