簡體   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