使用AfxGetApp()->GetMainWnd()而不是AfxGetMainWnd()使得MFC主程序接收辅助线程发送的消息

MFC主程序接收辅助线程发送的消息

MFC辅助线程向主线程窗口发送消息

在子线程中调用AfxGetMainWnd()->m_hWnd返回NULL

报错信息还可能是: AfxGetMainWnd(…) 返回nullptr。

通常认为AfxGetMainWnd()会返回主窗口的指针。实际上有“前提条件”的。即返回当前调用AfxGetMainWnd()的线程的主窗口指针。
具体地,在子线程/辅助线程(CreateThread创建的线程)中调用AfxGetMainWnd(),返回的是辅助线程的窗口指针,如果辅助线程没有创建窗口,则返回NULL
所以如果在程序的主线程中调用AfxGetMainWnd(),则可以得到主程序主窗口的指针,可以用它来与主窗口通讯;
如果发现在子线程/辅助线程中调用AfxGetMainWnd(),则不能得到主线程窗口的指针,返回值为空或辅助线程的窗口指针。参考官方说明

解决方案1:使用AfxGetApp()->GetMainWnd()获得主窗口指针

辅助线程中的错误调用:

AfxGetMainWnd()->PostMessage( WM_OUTPUT_MSG,PROC_REOPEN,0 );

函数AfxGetApp()可以在辅助线程中获取最顶层窗口指针,因此可以将上面的错误调用修改为:

AfxGetApp()->GetMainWnd()->PostMessage( WM_OUTPUT_MSG,PROC_REOPEN,0 );

或者

PostMessage( AfxGetApp()->GetMainWnd()->m_hWnd,PROC_REOPEN,0 );

解决方案2

在辅助线程中保存一份主窗口指针,例如叫gs_mWnd,则在辅助线程中发消息事可直接用:

PostMessage( gs_mWnd,PROC_REOPEN,0 );

你可能感兴趣的:(c++,MSVC,MFC,mfc,c++)