2013-06-08 6 views
2

저는 키패드를 델파이의 메모장 창으로 보내려고합니다. 코드의 지금까지 가지고SendMessage를 사용하여 Delphi의 Ctrl + V를 Delphi에서 보내십시오.

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, 
    windows, 
    messages; 

var 
    H : HWND; 

begin 
    H := FindWindowA(NIL, 'Untitled - Notepad'); 
    if H <> 0 then begin 
    SendMessage(H, WM_KEYDOWN, VK_CONTROL, 1); 
    SendMessage(H, WM_KEYDOWN, MapVirtualKey(ord('v'), 0), 1); 
    SendMessage(H, WM_KEYUP, MapVirtualKey(ord('v'), 0), 1); 
    SendMessage(H, WM_KEYUP, VK_CONTROL, 1); 
    end; 
end. 

내가이 예를 발견했습니다

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, 
    windows, 
    messages; 

var 
    H : HWND; 
    I : Integer; 
    s : String; 

begin 
    h := FindWindowA(NIL, 'Untitled - Notepad'); 
    if h <> 0 then 
    begin 
    h := FindWindowEx(h, 0, 'Edit', nil); 
    s := 'Hello'; 
    for i := 1 to Length(s) do 
    SendMessage(h, WM_CHAR, Word(s[i]), 0); 
    PostMessage(h, WM_KEYDOWN, VK_RETURN, 0); 
    PostMessage(h, WM_KEYDOWN, VK_SPACE, 0); 
    end; 
end. 

을 나는 시뮬레이션 할 수있는 방법/보내기가 다른 작업을 할 있도록 Parentwindow에 CTRL + V 응용 프로그램? 모든 응용 프로그램이 메모장과 동일한 ClassNames 및 컨트롤을 가지고있는 것은 아닙니다. 당신이 PostMessage를()에 sendMessage 첨부()을 전환하면

+1

핸들이 제대로 나오는지 알고 있습니까? (예 : 'if'트리거가있는 경우 메시지 팝업) – lurker

+3

대신 'WM_PASTE' 메시지를 게시 하시겠습니까? – TLama

+0

창 핸들을 찾고 유효합니다. 또한'SendMessage (H, WM_PASTE, 0, 0); 시도했지만 성공하지 못했습니다. –

답변

4

, 그것은 작동합니다

uses 
    Winapi.Windows, Winapi.Messages; 

procedure PasteTo(const AHWND: HWND); 
begin 
    PostMessage(AHWND, WM_PASTE, 0, 0); 
end; 

var 
    notepad_hwnd, notepad_edit_hwnd: HWND; 

begin 
    notepad_hwnd := FindWindow(nil, 'Untitled - Notepad'); 
    if notepad_hwnd <> 0 then 
    begin 
    notepad_edit_hwnd := FindWindowEx(notepad_hwnd, 0, 'Edit', nil); 
    if notepad_edit_hwnd <> 0 then 
     PasteTo(notepad_edit_hwnd); 
    end; 
end. 

this thread에 따르면, 당신이 sendMessage 첨부()를 사용할 수 없습니다 믿습니다/PostMessage를()는 (Ctrl 키를 키 수정의 상태를 보낼 이 경우) 그리고 유일한 옵션은 SendInput()과 함께가는 것이지만 현재 포커스가있는 창에서만 작동합니다.

+0

이 작업은 가능하지만 컨트롤 핸들이 필요합니다. 'Edit' 클래스가 전혀없는 다른 응용 프로그램에서 사용하고 싶다면 어떻게해야합니까? 현재 포커스가있는 활성 창을 찾으려면 어떻게해야 할 지 모르겠다. –

+1

다른 질문이 있습니다. 붙여 넣으려는 응용 프로그램에 현재 포커스가있는 경우 SendInput()을 사용하지 않는 이유는 무엇입니까? –

+1

질문에서 분명히 메모장 –