SendMessage WM_COPY发送到Chrome窗口DELPHI时不起作用

问题描述 投票:0回答:2

我已经尝试解决了好几个星期。我正在尝试在Delphi中创建一个在后台运行并捕获所有热键并执行Ctrl + c的应用程序。因此,我要做的就是捕捉例如ALT +右箭头的热键,然后模拟Ctrl + c并将命令扔到当前窗口。

[我注意到,当我尝试向Firefox发送命令时,如下所示:

SendMessage(FireFoxHandle, WM_COPY, 0, 0);
sleep(250);
CopiedText := ClipBoard.AsText;

复制成功,我得到了预期的文本。但是,一旦我在chrome(chrome_widget_1)或记事本等其他窗口中使用了同一行代码,就什么也收不到。所以我尝试的是获取chrome和记事本的子窗口,然后尝试将命令发送到子窗口。

  1. 将“ Chrome旧版窗口”作为“ chrome_widget_1”窗口的子项,但是当我尝试在标签中选择文本时,模拟Ctrl + c,仍然无法正常工作。

  2. 这里在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一样进行了研究,并尝试了它们,但是没有运气。我已经没有办法使它工作了。

感谢您的任何帮助。

google-chrome delphi delphi-xe2 notepad windows-messages
2个回答
0
投票

您在接受的答案中显示的MouseAndKeyInput代码只是Windows上SendInput()的包装,我在注释中告诉您使用3天前。您可以(并且应该)完全摆脱这5个.pas文件,并用对KeyInput的1个调用替换这3个单独的SendInput()方法调用。它可以一次发送所有4个按键输入(按下Ctrl,按下C,按下C,按下Ctrl)(在原子上)(这对于确保其他事件不会与您的事件混在一起很重要),例如: var Inputs: array[0..3] of TInput; begin ZeroMemory(@Inputs, SizeOf(Inputs)); Sleep(250); Inputs[0].type := INPUT_KEYBOARD; Inputs[0].ki.wVk := VK_CONTROL; Inputs[1].type := INPUT_KEYBOARD; Inputs[1].ki.wVk := Ord('C'); Inputs[2].type := INPUT_KEYBOARD; Inputs[2].ki.wVk := Ord('C'); Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP; Inputs[3].type := INPUT_KEYBOARD; Inputs[3].ki.wVk := VK_CONTROL; Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP; SendInput(4, Inputs, SizeOf(TInput)); Sleep(250); Memo1.Lines.Add(Clipboard.AsText); end;

[SendInput()cInputs的参数设置为1的情况下调用KeyInput是[[几乎总是]
实际上是一个错误,应该仅在极少数情况下执行。

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.