본문 바로가기

프로그래밍/Delphi

[Delphi/Tip] 프로그램간 메시지 전송

1. 개요

   - 독립된 다른 응용 프로그램간의 메시지 교환을 통해 프로그램을 제어 해 본다.

 

2. 처리 방법

 

   - Windows의 메시지인 WM_COPYDATA 를 이용한다.

   - 데이터 교환을 위해 CopyDataStruct 구조체를 이용한다.

   - SendMessage API를 이용한다.

 

   가. 메시지를 교환 하고자 하는 델파이 프로젝트 양쪽의 유닛에 messagesUses 절에 추가한다.

 

   나. 메시지를 보내는 쪽 Unit

- 메시지를 받을 응용 프로그램의 핸들을 얻는다. (FindWindow 이용)

- CopyDataStruct 구조체에 보낼 정보를 채운다.

- SendMessage를 이용해 받는쪽 윈도우 핸들에 WM_CopyData 메시지를 CopyDataStruct 구조체와 함께 보낸다.

- 처리는 보내는 프로시저 또는 함수를 별도로 만들어서 보내거나, 버튼 클릭 이벤트에 직접 코딩해도 된다.

 

처리 예 : 버튼 클릭 이벤트에 직접 작성

     - 파일명을 보내서 받는 쪽에서 해당 파일의 내용을 메모장에 읽도록 한다

var
  hwnd: THandle;
  DataStruct: CopyDataStruct;
begin
  //받을 윈도우 핸들을 윈도우 폼 이름을 이용해 찾는다.
  hwnd := FindWindow('TMyForm', nil);
  if hwnd <> 0 then
  begin
    DataStruct.dwData := 0;
    DataStruct.cbData := length(Ed_Filename.Text) + 1;  // 보낼 데이터 길이
    DataStruct.lpData := PChar(Ed_Filename.Text); // 보내고자 하는 데이터(예:파일명)
    // 받을 응용 프로그램의 폼을 활성화 시킨다(이 명령은 안해도 됨, 받는 윈도우를 Active시킬 필요가 있다면 하세요)
    SetForegroundWindow(hwnd);
    // SendMessage로 메시지를 보낸다.
    // SendMessage는 받는 쪽에서 메시지를 받아서 처리해야만 제어가 다시 넘어온다(동기모드).
    // 메시지를 보내기만 하고 받는 쪽에서 처리하던지 말던지 상관 없다면 PostMessage를 이용하도록 한다(비동기모드).
    SendMessage(hwnd, wm_CopyData, Form1.Handle, Integer (@DataStruct));
  end;
end;

다. 메시지를 받아서 처리하는 쪽 Unit

 

  - 선언

 

procedure CopyData(var Msg: TWMCopyData); message wm_CopyData;

 

  -구현

 

procedure TMyForm.CopyData(var Msg: TWmCopyData);
var
  Filename: String;
begin
  // 옵션 : 현재 프로그램이 최소화(아이콘)되어 있는 상태라면 폼을 원복 시킨다
  if IsIconic(Application.Handle) then
    Application.Restore;
  // 받은 메시지를 추출한다.
  Filename := PChar(Msg.CopyDataStruct.lpData);
  // 받은 파일을 열어서 RichEdit 컴포넌트에 불러온다.
  try
    RichEdit1.Lines.LoadFromFile(Filename);
  except
      MessageDlg('Invalid file', mtWarning, [mbOK], 0);
  end;
end;