怎么获得主窗口的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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值