2013-07-11 63 views
1

有沒有什麼辦法模擬delphi中的Ctrl + C命令? 問題是我想從另一個應用程序例如在選擇目標文本後從記事本複製文本。如何在Delphi中模擬Ctrl + c

+1

發送'WM_COPY'消息。 –

+0

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

+0

@ANdreas我只是嘗試它之前,它不與別人合作的過程。 – Oussaki

回答

11

(讓我先說一下,使用剪貼板進行進程間通信是個不錯的主意,剪貼板屬於用戶,您的應用程序只應該使用它作爲用戶選擇的結果。 )

如果您在記事本中選擇文本,這將讓內容到一個Delphi窗體上的TMemo(只使用一個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; 

樣本結果:

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謝謝你肯你是最好的。 (y)的 – Oussaki

4

有什麼辦法來模擬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擊鍵需要有輸入焦點的應用程序。