有什么方法可以在 delphi 中模拟 Ctrl+C 命令?问题是我希望从另一个应用程序中,例如在选择目标文本后从记事本复制文本。
问问题
3559 次
2 回答
12
(让我先说使用剪贴板进行进程间通信是一个坏主意。剪贴板属于用户,您的应用程序只能在用户选择这样做的情况下使用它。)
如果您在记事本中选择了文本,这会将内容放入TMemo
Delphi 表单上的 a 中(仅使用 aTMemo
和TButton
; 添加ClipBrd
到您的 uses 子句):
procedure TForm1.Button1Click(Sender: TObject);
var
NpWnd, NpEdit: HWnd;
begin
Memo1.Clear;
NpWnd := FindWindow('Notepad', nil);
if NpWnd <> 0 then
begin
NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
if NpEdit <> 0 then
begin
SendMessage(NpEdit, WM_COPY, 0, 0);
Memo1.Lines.Text := Clipboard.AsText;
end;
end;
end;
结果样本:
如果没有先选择文本,请先发送一条WM_SETSEL
消息。传递0
和 '-1' 的值会选择所有文本。
procedure TForm1.Button1Click(Sender: TObject);
var
NpWnd, NpEdit: HWnd;
begin
Memo1.Clear;
NpWnd := FindWindow('Notepad', nil);
if NpWnd <> 0 then
begin
NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
if NpEdit <> 0 then
begin
SendMessage(NpEdit, EM_SETSEL, 0, -1);
SendMessage(NpEdit, WM_COPY, 0, 0);
Memo1.Lines.Text := Clipboard.AsText;
end;
end;
end;
于 2013-07-11T23:31:17.510 回答
5
有什么方法可以模拟CTRL+C吗?
做到这一点的方法是使用SendInput
Win32的功能来合成击键。这是一个例子:
procedure SendCtrlC;
var
Inputs: array [0..3] of TInput;
begin
ZeroMemory(@Inputs, SizeOf(Inputs));
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_CONTROL;
Inputs[0].ki.dwFlags := 0; // key down
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := ord('C');
Inputs[1].ki.dwFlags := 0; // key down
Inputs[2].Itype := INPUT_KEYBOARD;
Inputs[2].ki.wVk := ord('C');
Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP;
Inputs[3].Itype := INPUT_KEYBOARD;
Inputs[3].ki.wVk := VK_CONTROL;
Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(4, Inputs[0], SizeOf(Inputs[0]));
end;
自然,您希望接收CTRL+C击键的应用程序需要具有输入焦点。
于 2013-07-12T08:32:22.730 回答