我用
HWND g_WindowHandle=((CMainFrame *)AfxGetMainWnd())->GetSafeHwnd();
获取主窗口句柄
然后
SendMessage(g_WindowHandle,WM_USER,0,0);
再然后
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_USER)
AfxMessageBox("接到WM_USER消息");
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
结果,AfxMessageBox("接到WM_USER消息")没有对话框出来
查阅资料发现
若消息为非队列消息,PreTranslateMessage当然截不到。而
SendMessage不经过消息循环,直接调用窗口函数,MFC的消息循环大致如下:
if (GetMessage(...))
{
PreTranslateMessage(...);
DispatchMessage(...);
}
DispatchMessgage最终导致调用CWnd::WindowProc.
PostMessage要经过PreTranlateMessage,而SendMessage连DispatchMessage都不经过,直接调用CWnd::WindowProc()
所以,不要在PreTranslateMessage响应,而用消息影射,肯定能得到你想得到的
可用如下代码发送消息:
void CDemo3Dlg::OnButton1()
{
HWND hWnd=AfxGetMainWnd()->GetSafeHwnd();
//获取主窗口句柄
::PostMessage(hWnd, WM_USER, 0, 0);
}
接收消息如下:
BOOL CDemo3Dlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_USER){
AfxMessageBox("Reviced the WM_USER message");
return true;
}
return CDialog::PreTranslateMessage(pMsg);
}