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' 카테고리의 다른 글
[강좌-Delphi]웹브라우저(TWebBrowser)의 사용자 인터페이스 커스터마이징 (0) | 2018.10.06 |
---|---|
[강좌-Delphi]웹브라우저에서 자바스크립트로 델파이 코드 실행하기 (0) | 2018.10.06 |
DelphiXE 10 Seatle IDE가 느려지는 현상 개선 (0) | 2016.10.06 |
[Tips] 등록된 프레임을 갑자기 사용할 수 없을 때 (0) | 2016.09.05 |
페이스북(Facebook) Feed 읽어들이기 (0) | 2016.07.20 |