티스토리 뷰
다른 프로그램에게 메시지 전달
ON_REGISTERED_MESSGAE 를 사용한다.
메시지 보내는 곳에서 RegisterWindowMessage()로 등록한 UINT 값을 메시지로 보낸다.
SendMessage() 로 보내면 무슨 문제인지 "메시지 전송 완료" 창을 보이지 않고 Lock 걸려
일단, PostMessage() 로 메시지 보낸다.
메시지 보내는곳 코드 5행 처럼 보낼 윈도우 핸들은 HWND_BROADCAST 로 지정하고, 메시지는 RegisterWindowMessage() 반환값으로 지정하면 된다.
메시지 보내는곳에서 RegisterWindowMessage() 와 똑같이 메시지 받는곳에서는 외부 변수로 만든다.
<메시지 보내는 곳>
1
2
3
4
5
6
7
8 |
void CTest1Dlg::OnBnClickedButtonMsg()
{
AfxMessageBox(TEXT("메시지 전송 전"));
UINT uMsg = ::RegisterWindowMessage(TEXT("TEST1"));
::PostMessage(HWND_BROADCAST, uMsg, WPARAM(1), LPARAM(2));
//::SendMessage(HWND_BROADCAST, uMsg, WPARAM(1), LPARAM(2));
AfxMessageBox(TEXT("메시지 전송 완료"));
} |
cs |
<메시지 받는곳>
1
2
3
4
5
6 |
class CTest2Dlg : public CDialogEx
{
...
public:
LRESULT OnRevMsg(WPARAM wParam, LPARAM lParam);
}; |
cs |
아래 코드 1행처럼 메시지 보내는곳에서 등록한거와 같게 외부 변수로 만든다.
(지역변수로 하면 5행에서 에러난다)
메시지 처리함수를 등록하고 만든다.
(위 코드 5행, 아래코드 5, 8~13행)
1
2
3
4
5
6
7
8
9
10
11
12
13 |
UINT uMsg = ::RegisterWindowMessage(TEXT("TEST1")); // 외부변수
BEGIN_MESSAGE_MAP(CTest2Dlg, CDialogEx)
...
ON_REGISTERED_MESSAGE(uMsg, OnRevMsg)
END_MESSAGE_MAP()
LRESULT CTest2Dlg::OnRevMsg(WPARAM wParam, LPARAM lParam)
{
CString str; str.Format(TEXT("%d"), int(lParam));
AfxMessageBox(str);
return 0L;
} |
cs |
<실행결과>