资料:
<<Message Management>>
http://www.codeproject.com/KB/dialog/messagemgmt.aspx
1. 用WM_APP来定义消息
/** * @note 用WM_APP的方法实现自定义消息 * 消息定义需要4步 * 指定正确的hWnd, 从程序的任意位置发送消息, 都可以到达消息处理函数 */ /** 用户自定义消息(定义消息) Setp1 */ /** 用户自定义消息(定义消息) Setp2 */ /** 用户自定义消息(定义消息) Setp3 */ /** 用户自定义消息(定义消息) Setp4 */ /** 用户自定义消息(发送消息, 从Dlg) Setp5.1 */ /** 用户自定义消息(发送消息, 从MainFrame) Setp5.2 */ /** 用户自定义消息(发送消息, 从App) Setp5.3 */ /** 用户自定义消息(发送消息, 从Doc) Setp5.4 */ /** 用户自定义消息(发送消息, 从View) Setp5.5 */
/** 用户自定义消息(定义消息) Setp1 */ /** doc.h */ #define USER_MSG1 WM_APP + 1000 #define USER_MSG1_WPARAM_BASE 100 #define USER_MSG1_WPARAM_FROM_DLG (USER_MSG1_WPARAM_BASE + 0) #define USER_MSG1_WPARAM_FROM_FRAME (USER_MSG1_WPARAM_BASE + 1) #define USER_MSG1_WPARAM_FROM_APP (USER_MSG1_WPARAM_BASE + 2) #define USER_MSG1_WPARAM_FROM_DOC (USER_MSG1_WPARAM_BASE + 3) #define USER_MSG1_WPARAM_FROM_VIEW (USER_MSG1_WPARAM_BASE + 4)
// Generated message map functions protected: //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnUserMsgFromFrame(); /** 用户自定义消息(定义消息) Setp2 */ /** MainFrame.h */ afx_msg LRESULT OnUserMsg1(WPARAM wp, LPARAM lp); //}}AFX_MSG DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(IDM_USER_MSG_FROM_FRAME, OnUserMsgFromFrame) /** 用户自定义消息(定义消息) Setp3 */ /** MainFrame.cpp */ ON_MESSAGE(USER_MSG1, OnUserMsg1) //}}AFX_MSG_MAP END_MESSAGE_MAP()
/** 用户自定义消息(定义消息) Setp4 */ /** MainFrame.cpp */ LRESULT CMainFrame::OnUserMsg1(WPARAM wp, LPARAM lp) { LRESULT lRc = S_OK; CString csMsg; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); if(lp) { CString * pMsg = (CString *)lp; csMsg = *pMsg; delete (pMsg); pMsg = NULL; pWnd->SetWindowText(csMsg); } /** * @note * 在实际应用中, 根据wp, lp, 来确定具体的消息处理 */ switch(wp) { case USER_MSG1_WPARAM_FROM_DLG: { } break; case USER_MSG1_WPARAM_FROM_FRAME: { } break; case USER_MSG1_WPARAM_FROM_APP: { } break; case USER_MSG1_WPARAM_FROM_DOC: { } break; case USER_MSG1_WPARAM_FROM_VIEW: { } break; default: { } break; } return lRc; }
/** 用户自定义消息(发送消息, 从Dlg) Setp5.1 */ /** App.cpp */ void CAboutDlg::OnOK() { // TODO: Add extra validation here CString * pcsMsg = new CString; *pcsMsg = "the message from CAboutDlg::OnOK()/n"; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); ::PostMessage(pWnd->m_hWnd, USER_MSG1, USER_MSG1_WPARAM_FROM_DLG, (LPARAM)(pcsMsg)); CDialog::OnOK(); }
/** 用户自定义消息(发送消息, 从MainFrame) Setp5.2 */ /** MainFrame.cpp */ void CMainFrame::OnUserMsgFromFrame() { // TODO: Add your command handler code here CString * pcsMsg = new CString; *pcsMsg = "the message from CMainFrame::OnUserMsgFromFrame()/n"; ::PostMessage(this->m_hWnd, USER_MSG1, USER_MSG1_WPARAM_FROM_FRAME, (LPARAM)(pcsMsg)); }
/** 用户自定义消息(发送消息, 从App) Setp5.3 */ /** App.cpp */ void CUserMsg1App::OnFileOpen() { // TODO: Add your command handler code here CString * pcsMsg = new CString; *pcsMsg = "the message from CUserMsg1App::OnFileOpen()/n"; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); ::PostMessage(pWnd->m_hWnd, USER_MSG1, USER_MSG1_WPARAM_FROM_APP, (LPARAM)(pcsMsg)); }
/** 用户自定义消息(发送消息, 从Doc) Setp5.4 */ /** Doc.cpp */ void CUserMsg1Doc::Serialize(CArchive& ar) { CString * pcsMsg = new CString; *pcsMsg = "the message from CUserMsg1Doc::Serialize()/n"; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); ::PostMessage(pWnd->m_hWnd, USER_MSG1, USER_MSG1_WPARAM_FROM_DOC, (LPARAM)(pcsMsg)); if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } }
/** 用户自定义消息(发送消息, 从View) Setp5.5 */ /** View.cpp */ void CUserMsg1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing CString * pcsMsg = new CString; *pcsMsg = "the message from CUserMsg1View::OnBeginPrinting()/n"; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); ::PostMessage(pWnd->m_hWnd, USER_MSG1, USER_MSG1_WPARAM_FROM_VIEW, (LPARAM)(pcsMsg)); }
2. 使用RegisterWindowMessage来定义消息, 可以保证消息是唯一的.
和WM_APP来比较, 定义不同, 发送消息的部分相同
/** 用户自定义消息(定义消息) Setp1 * MainFrame.h * 如果想使每个程序注册的消息是唯一的, 使用GUIDGEN.EXE来产生自定义消息的名称 * 如果想使每个程序实例注册的消息是唯一的, 需要在程序中加入GUIDGEN的功能, CodeProject上有例子 * 在程序每次实例化的时候,自已产生GUID串, 并拼接消息名称 */ static const UINT USER_MSG1 = ::RegisterWindowMessage(_T("USER_MSG1-{CD61A355-231A-4c28-8F44-7BB2EC2AF9CD}")); #define USER_MSG1_WPARAM_BASE 100 #define USER_MSG1_WPARAM_FROM_DLG (USER_MSG1_WPARAM_BASE + 0) #define USER_MSG1_WPARAM_FROM_FRAME (USER_MSG1_WPARAM_BASE + 1) #define USER_MSG1_WPARAM_FROM_APP (USER_MSG1_WPARAM_BASE + 2) #define USER_MSG1_WPARAM_FROM_DOC (USER_MSG1_WPARAM_BASE + 3) #define USER_MSG1_WPARAM_FROM_VIEW (USER_MSG1_WPARAM_BASE + 4)
// Generated message map functions protected: //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnUserMsgFromFrame(); /** 用户自定义消息(定义消息) Setp2 */ /** MainFrame.h */ afx_msg LRESULT OnUserMsg1(WPARAM wp, LPARAM lp); //}}AFX_MSG DECLARE_MESSAGE_MAP()
/** 用户自定义消息(定义消息) Setp3 */ /** MainFrame.cpp */ ON_REGISTERED_MESSAGE(USER_MSG1, OnUserMsg1) //}}AFX_MSG_MAP END_MESSAGE_MAP()
/** 用户自定义消息(定义消息) Setp4 */ /** MainFrame.cpp */ LRESULT CMainFrame::OnUserMsg1(WPARAM wp, LPARAM lp) { LRESULT lRc = S_OK; CString csMsg; CMainFrame * pWnd = (CMainFrame *)AfxGetMainWnd(); if(lp) { CString * pMsg = (CString *)lp; csMsg = *pMsg; delete (pMsg); pMsg = NULL; pWnd->SetWindowText(csMsg); } /** * @note * 在实际应用中, 根据wp, lp, 来确定具体的消息处理 */ switch(wp) { case USER_MSG1_WPARAM_FROM_DLG: { } break; case USER_MSG1_WPARAM_FROM_FRAME: { } break; case USER_MSG1_WPARAM_FROM_APP: { } break; case USER_MSG1_WPARAM_FROM_DOC: { } break; case USER_MSG1_WPARAM_FROM_VIEW: { } break; default: { } break; } return lRc; }
3. 在程序中动态的产生GUID的资料
<<Creating your own GUIDs>>
http://www.codeproject.com/KB/tips/genguids.aspx
可以修改一下,使每个程序实例,都使用唯一的消息. 这样,即使别的程序指定了我的窗口, 我的消息处理函数他也进不来.
因为他的自定义消息不对. 这还有些实际意义呢.
实验成功了, 每一个程序实例的消息都不同.
上面3种情况的实验工程已上传,下载点: