一、 User defined message A::窗口消息---------------- 1. #define WM_MY_MSG WM_USER + 0x100 2. afx_msg LRESULT OnMyMsg(WPARAM, LPARAM); 3. LRESULT CTestDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) {...} 4. BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ... ON_MESSAGE(WM_MY_MSG, &CTestDlg::OnMyMsg) END_MESSAGE_MAP() B::线程消息---------------- 1. #define WM_MY_THRD_MSG WM_USER + 100 2. afx_msg void OnMyThrdMsg(WPARAM, LPARAM); 3. void CTestApp::OnMyThrdMsg(WPARAM wParam, LPARAM lParam) {...} 4. BEGIN_MESSAGE_MAP(CTestApp, CWinAppEx) ... ON_THREAD_MESSAGE(WM_MY_THRD_MSG, &CTestApp::OnMyThrdMsg) END_MESSAGE_MAP() ***How to trigger in current thread*** ::PostMessage(NULL, WM_MY_THRD_MSG, 0, 0); ::PostThreadMessage(::GetCurrentThreadId(), WM_MY_THRD_MSG, 0, 0); 二、 Register Window Message A::窗口消息---------------- 1. UINT nMsgRegistered = ::RegisterWindowMessage(TEXT("RegisterMsgName")); 2. afx_msg LRESULT OnMyRegisteredMsg(WPARAM, LPARAM); 3. LRESULT CTestDlg::OnMyRegisteredMsg(WPARAM wParam, LPARAM lParam) {...} 4. BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ... ON_REGISTERED_MESSAGE(nMsgRegistered, &CTestDlg::OnMyRegisteredMsg) END_MESSAGE_MAP() B::线程消息---------------- 1. UINT nThrdMsgRegistered = ::RegisterWindowMessage(TEXT("MyThrdMsg")); 2. afx_msg void OnMyRegisterdThrdMsg(WPARAM, LPARAM); 3. void CTestApp::OnMyRegisterdThrdMsg(WPARAM wParam, LPARAM lParam) {...} 4. BEGIN_MESSAGE_MAP(CTestApp, CWinAppEx) ... ON_REGISTERED_THREAD_MESSAGE(nThrdMsgRegistered, &CTestApp::OnMyRegisterdThrdMsg) END_MESSAGE_MAP() ***How to trigger in current thread*** ::PostMessage(NULL, nThrdMsgRegistered, 0, 0); ::PostThreadMessage(::GetCurrentThreadId(), nThrdMsgRegistered, 0, 0); 三、 PostThreadMessage A::同一进程不同线程之间----------------- 1. 编写线程函数 UINT AFX_CDECL ThrdTest(LPVOID lpParam) { MSG msg; while (::GetMessage(&msg, NULL, 0, 0)) { switch(msg.message) { case WM_XXX: {...} break; ...... default: break; } } return 0; } 2. 启动线程 UINT AFX_CDECL ThrdTest(LPVOID); AfxBeginThread(ThrdTest, ...); 3. 向线程发送消息 ::PostThreadMessage(nThrdId, WM_XXX, wParam, lParam); B::不同进程之间-------------------------- 1. 进程I #include <iostream> #include <Windows.h> using namespace std; int main() { MSG msg; while (::GetMessage(&msg, NULL, 0, 0)) { switch(msg.message) { case WM_XXX: {...} break; ...... default: break; } } return 0; } 2. 进程II CreateProcess(...); ::PostThreadMessage(nThrdId, WM_XXX, wParam, lParam);