李国帅
最简单的方法是这样使用,这样就不用担心因为子窗口阻塞导致系统无法销毁。
在发送端和接收端都首先要定义消息
如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:
//注册的方法在两个地方都要注册。
static UINT WM_MY_MESSAGE = RegisterWindowMessage("User");
UINT UM_MESSAGEID = ::RegisterWindowMessage(_T("Message description"));
并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令。
或者直接定义一个消息id,用户自定义消息至少是WM_USER+100,可以放在resource.h中。
#define UM_MESSAGEID WM_USER + 500
算法部分
在需要发消息的地方使用 SendMessage 或者 PostMessage
窗口部分
在类头文件的AFX_MSG块中定义消息处理函数
// {{AFX_MSG(CMainFrame)
LRESULT OnUserMessagexxx(WPARAM wParam, LPARAM lParam);
//afx_msg LRESULT OnUserMessagexxx(WPARAM wParam, LPARAM lParam);
//afx_msg宏表示声明的是一个消息响应函数。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
实现消息处理函数,该函数使用WPRAM和LPARAM参数并返回LPESULT
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) {
// TODO: 处理用户自定义消息
//...
return 0;
}
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
将消息和该函数绑定
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) //非注册方法
ON_REGISTERED_MESSAGE(UM_MESSAGEID, OnUserMessagexxx)//注册方法
//}}AFX_MSG_MAP
我这样测了一个消息
窗口
afx_msg LRESULT OnUMGrabInfo(WPARAM wParam, LPARAM lParam);//.h
ON_MESSAGE(UM_INFOID, OnUMGrabInfo) //非注册方法 //.cpp
#define UM_INFOID WM_USER + 1979// resource.h
发送类
告知目标窗口需要关闭
SendMessage(m_hInfoWnd, UM_INFOID, NULL, NULL);
DWORD result;
SendMessageTimeout(wnd->m_hWnd, // 目标窗口
WM_MY_MESSAGE, // 消息
0, // WPARAM
0, // LPARAM
SMTO_ABORTIFHUNG | SMTO_NORMAL,
TIMEOUT_INTERVAL,
&result);
以避免其它进程如果被阻塞而造成系统死等状态。
//wParam通常传递全局对象指针,lParam传递一个临时指针,在vc中都一样,但是在其他的语言只有lparam能够正确传递。
LRESULT CGWServerTestDlg::OnLoginMsg(WPARAM wParam, LPARAM lParam)
{
if (wParam != NULL)
{
if ((LONG_PTR)lParam == 1)
{
//CGWServerTestDlg* p = (CGWServerTestDlg*)wParam;
//CString strInfo =(char*)wParam;
return 0;
}
}
return 0;
}