프로그램간 메세지 전송
1. 개요
- 독립된 다른 응용 프로그램간의 메시지 교환을 통해 프로그램을 제어 해 본다.
2. 처리 방법
- Windows의 메시지인 WM_COPYDATA 를 이용한다.
- 데이터 교환을 위해 CopyDataStruct 구조체를 이용한다.
- SendMessage API를 이용한다.
가. 메시지를 교환 하고자 하는 델파이 프로젝트 양쪽의
유닛에 messages 를 Uses 절에 추가한다.
나. 메시지를 보내는 쪽 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;
'Delphi Tip > +Tip' 카테고리의 다른 글
Windows PC보호 해결방법 전자서명 후 배포 (0) | 2022.04.14 |
---|---|
델파이 컴파일러 지시어 {$IFDEF} (0) | 2022.04.12 |
윈도우 종료(재시작) 3가지 방법 (0) | 2022.04.05 |
실행파일명으로 프로세스(TASK) 죽이기 (0) | 2022.03.31 |
레지스트리 읽고 쓰기 (0) | 2022.03.29 |
댓글