1、问题背景:

  由于业务需要,要在MFC类型的exe和dll之间传递窗口消息,但经常遇到窗口消息接收不到的问题,每次都要花费大量的时间来定位问题,这里针对几种典型的应用场景记录一下问题的出现原因和解决方法。

2、应用场景一(窗口消息能正确接收):

(1)应用程序是MFC单文档工程,dll是带界面的MFC动态库;

(2)dll程序中以添加对话框类的方式创建界面资源,并通过CDialog::Create函数完成窗口的实例化和显示;

(3)在dll对话框类的OnInitDialog函数中通过SetWindowText宏设置对话框标题,然后在对话框外部通过FindWindow宏确定目标对话框的窗口句柄;

(4)在应用程序中直接通过SendMessage向上述dll中的对话框类发送窗口消息,在对话框类中通过ON_MESSAGE宏添加消息的接收函数即可正常接收。

3、应用场景二(窗口消息无法正确接收):

(1)应用程序是MFC单文档工程,dll是不带界面的MFC动态库,消息从dll发出,由应用程序接收;

(2)在应用程序的view类中定义m_hWnd成员变量,但转为int发现是0,后来改为通过FindWindow查找窗口句柄,并通过dll的导出函数将其发送到dll中;

(3)在dll中通过SendMessage向上述句柄对应的窗口发送消息,然后在应用程序的view类中添加ON_MESSAGE响应函数,结果没有接收到发出的消息。

4、问题原因:

(1)场景二中是在应用程序的doc类中调用了CDocument::SetTitle函数,从而完成窗口标题的设置,在这种情况下,当外部通过上述获取到的句柄向其发送窗口消息时,对应的ON_MESSAGE响应函数需要在frame类中定义,并转发到view类,具体原因没有进一步研究;

(2)上述两个场景的区别是对话框的标题设置位置不同,但暂时没有尝试过在场景二的view类中设置标题时,消息能否直接接收到。