繁体   English   中英

如何在Delphi中模拟Ctrl + c

[英]how to Simulate Ctrl+ c in Delphi

有没有办法在delphi中模拟Ctrl + C命令? 问题是我希望从另一个应用程序,例如在选择目标文本后从记事本复制文本。

(让我先说明使用剪贴板进行进程间通信是一个坏主意。剪贴板属于用户,您的应用程序应该只使用它作为用户选择这样做的结果。)

如果您在记事本中选择文本,这将让内容制作成TMemo一个Delphi形式(只使用一个TMemoTButton ;添加ClipBrd到您的使用条款):

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;

有没有办法模拟CTRL + C

这样做的方法是使用Win32的SendInput函数来合成击键。 这是一个例子:

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键击的应用程序需要具有输入焦点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM