Reputation: 1649
is there any way to simulate Ctrl+C command in delphi ? the problem is i want that from another application for example copy a text from Notepad after select the target text .
Upvotes: 3
Views: 4607
Reputation: 612794
Is there any way to simulate CTRL+C?
The way to do this is to use the SendInput
function of Win32 to synthesize keystrokes. Here is an example:
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;
Naturally the application which you wish to receive the CTRL+C key stroke will need to have input focus.
Upvotes: 5
Reputation: 125620
(Let me preface this by saying that using the clipboard for inter-process communication is a bad idea. The clipboard belongs to the user, and your application should only use it as a result of the user choosing to do so.)
If you have text selected in Notepad, this will get the contents into a TMemo
on a Delphi form (uses just a TMemo
and TButton
; add ClipBrd
to your uses clause):
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;
Sample of results:
If the text is not selected first, send it a WM_SETSEL
message first. Passing values of 0
and '-1' selects all text.
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;
Upvotes: 13