怎么获得主窗口的CWnd*?怎么把CWnd*变成HWND?怎么给HWND发送WM_USER消息?SendMessage(hwnd,WM_USER,0,0);可是主窗口接收不到

我用

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);
}

你可能感兴趣的:(user,mfc)