不能将消息发送到从CWnd派生的自定义类

MFC - Cannot Post Message to a custom class derived from CWnd

本文关键字:派生 CWnd 自定义 消息 不能      更新时间:2023-10-16

我有一个从CWnd派生的自定义类,我想从工作线程发布消息。我使用PostMessage函数来实现这一点。PostMessage的第一个参数是我的类的HWND类型句柄,下一个是我想处理的消息。对于第一个参数,我使用GetSafeHwnd()函数生成类的句柄,对于第二个参数,我使用WM_USER+3。另外,我在类头文件中声明了一个消息映射,并在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP块中为消息处理程序添加了一个条目。然而,我的处理程序没有被调用。我也检查了PostMessage函数的返回值,它是1,这意味着成功。

下面是我的代码: 在MyClass.h

class CMyClass : CWnd
{
....
.... 
public:
void InitHandle();
protected:
afx_msg LRESULT OnMessageReceived(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
} 
在MyClass.cpp

#define WM_MY_MESSAGE WM_USER+3
HWND handleToMyClassWindow;
BEGIN_MESSAGE_MAP(CMyClass, CWnd)
    ON_MESSAGE(WM_MY_MESSAGE, OnMessageReceived)
END_MESSAGE_MAP()
LRESULT CMyClass::OnMessageReceived(WPARAM wParam, LPARAM lParam)
{ .... }
void CMyClass::InitHandle()
{ 
    handleToMyClassWindow = GetSafeHwnd();
}

内部工作线程

UINT WorkerThreadFunction(LPVOID pParam )
{ 
....
PostMessage(handleToMyClassWindow, WM_MY_MESSAGE, NULL, NULL);
....
}

我的问题是,onmessagerreceived处理程序不被调用的可能原因是什么?

公立小学

我注意到调用对象调用了InitHandle()函数。

我尝试了同样的技术与我的程序的视图类(从CView派生),它在那里工作,但在这里失败。

如果未创建窗口,则不能向窗口发送内容。如果你没有使用你的类创建一个窗口,GetSafeHwnd()将返回NULL。