2013-07-11 2 views
1

은 델파이에서 Ctrl + C 명령을 시뮬레이트 할 수있는 방법이 있습니까? 문제는 다른 응용 프로그램에서 예를 들어 대상 텍스트를 선택한 후 메모장에서 텍스트를 복사하려는 경우입니다.델파이에서 Ctrl + c를 시뮬레이트하는 방법

+1

'WM_COPY'메시지를 보냅니다. –

+0

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

+0

@ANdreas 방금 전에 시도했지만 다른 사람들과 처리하지 않습니다. – Oussaki

답변

11

(프로세스 간 통신을 위해 클립 보드를 사용하는 것은 좋지 않습니다. 클립 보드는 사용자에게 속하므로 응용 프로그램은 사용자가 선택한 결과로만 응용 프로그램을 사용해야합니다. 당신이 텍스트를 메모장에서 선택한 경우,이 델파이 양식에 TMemo에 내용을 얻을 것이다

) (단지 TMemoTButton 사용하며, 당신의 uses 절에 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의 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 키 스트로크 (keystroke)를 수신하고자하는 응용 프로그램입니다.

관련 문제