我有一個從CWnd派生的自定義類,我想從工作線程發佈消息。我正在使用PostMessage函數來實現這一點。 PostMessage的第一個參數是我的類的HWND類型句柄,接下來是我想要處理的消息。對於第一個參數,我使用GetSafeHwnd()函數爲我的類生成句柄,對於第二個參數,我使用WM_USER + 3。另外,我在我的類頭文件中聲明瞭一個消息映射,並在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP塊內爲消息處理程序添加一個條目。但是,我的處理程序沒有被調用。我也檢查了PostMessage函數的返回值,它是1,這意味着成功。MFC - 不能將消息發送到從CWnd派生的自定義類
這裏是我的代碼:
內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);
....
}
我的問題是,什麼是可能的reaso ns用於OnMessageReceived處理程序不被調用。
P.S.
我注意調用對象調用InitHandle()函數。
我試過與我的程序的View類(從CView派生)相同的技術,它在那裏工作,但在這裏失敗。
不要使用'WM_USER',請使用'WM_APP'。某些標準控件也使用了'WM_USER'範圍 - 您可能會註冊兩次相同的消息。 –
@MarkRansom,我試過WM_APP,它仍然沒有工作。另外,如果我將處理程序添加到我的程序的View類,我的代碼就可以工作,但如果添加到我的自定義類中,它不起作用。 – user2654449
下面是另一個有趣的事情:從類Explorer中,我右鍵單擊CMyClass,並打開屬性框。我在CMyClass的消息列表中看不到我的消息。 – user2654449