我已经尝试解决了好几个星期。我正在尝试在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一样进行了研究,并尝试了它们,但是没有运气。我已经没有办法使它工作了。
感谢您的任何帮助。
您在接受的答案中显示的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
是[[几乎总是]