ワーカースレッドからメッセージを投稿したいCWndから派生したカスタムクラスがあります。これを実現するためにPostMessage関数を使用しています。PostMessageの最初の引数は、クラスへのHWNDタイプのハンドルであり、次の引数は、処理したいメッセージです。最初のパラメーターには、GetSafeHwnd()関数を使用してクラスへのハンドルを生成し、2番目のパラメーターには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);
....
}
私の質問は、OnMessageReceivedハンドラーが呼び出されない理由として考えられるものは何ですか。
PS
呼び出し元のオブジェクトがInitHandle()関数を呼び出すように注意します。
プログラムのViewクラス(CViewから派生)で同じ手法を試しましたが、そこでは機能しますが、ここでは失敗します。
ウィンドウが作成されていない場合、ウィンドウに投稿することはできません。クラスを使用して実際にウィンドウを作成していない場合、GetSafeHwnd()はNULLを返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加