2013-07-11 8 views
1

есть ли способ имитации команды Ctrl + C в delphi? Проблема в том, что я хочу, чтобы из другого приложения, например, скопировал текст из Блокнота после выбора целевого текста.как имитировать Ctrl + c в Delphi

+1

Отправить сообщение 'WM_COPY'. –

+0

http://www.delphipages.com/forum/showthread.php?t=152642 –

+0

@ANdreas Я просто пробовал это раньше, и он не работает с другими процессами. – Oussaki

ответ

11

(Позвольте мне предисловие к этому, сказав, что использование буфера обмена для межпроцессного общения - плохая идея. Буфер обмена принадлежит пользователю, и ваше приложение должно использовать его только в результате того, что пользователь решил это сделать.)

Если вы выделили текст в блокноте, это будет получить содержимое в TMemo на форме Delphi (использует только TMemo и TButton, добавить 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; 

образец результаты:

Text copied from Notepad

Если текст не выбран первый, отправить ему сообщение 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; 
+0

это симпатичный произведение хорошо. почему я не могу задать больше вопросов на этом веб-сайте? – Oussaki

+1

@Oussaki: Я понятия не имею, почему вы не можете задавать больше вопросов. Вы должны проверить [meta] для этого типа информации; это вопросы, связанные с работой, дизайном и руководством StackOverflow. (Вы видели, что я ответил на ваш [другой вопрос] (http://stackoverflow.com/a/17605421/62576)?) –

+1

ahaha Спасибо, Кен, ты здесь лучший. (У) – Oussaki

4

Есть ли способ, чтобы имитировать CTRL + C?

Способ использования этой функции - использовать функцию 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 необходимо иметь фокус ввода.

Смежные вопросы