You are currently offline, waiting for your internet to reconnect

PRB: MFC Message Handler Not Called with PostThreadMessage()

This article was previously published under Q142415
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
SYMPTOMS
When code uses the PostThreadMessage() Win32 function, the MFC messagehandlers are not called.
CAUSE
When you call PostThreadMessage(), the message is placed in the thread'smessage queue. However, because messages posted this way are not associatedwith a window, MFC will not dispatch them to message or command handlers.In order to handle these messages, override the PreTranslateMessage()function of your CWinApp-derived class, and handle the messages manually.
RESOLUTION
The following code demonstrates how to call PostThreadMessage() in theInitInstance() of the CWinApp-derived class using a single-threadedapplication. The principle is the same for secondary threads except thatthe code shown here would be put in your alternate CWinThread-derivedclass.

Visual C++ 4.2 does support handling messages posted to threads. For moreinformation, see ON_THREAD_MESSAGE in the Visual C++ 4.2 documentation.

NOTE: MFC worker threads do not have a message loop/pump associated withthem so you must use a user-interface thread.

Sample Code

/* Compile options needed:   standard MFC project generated by AppWizard */ BOOL CThreadMsgApp::PreTranslateMessage(MSG* pMsg){    // Is it the Message you want?    // You can use a switch statement but because this is    // only looking for one message, you can use the if/else    if (pMsg->message == WM_USER+2268)    {        // Call the function to handle this message   OnReceivedCommand(pMsg->wParam,pMsg->lParam);        // Tell MFC no more processing is needed        return TRUE;    }    else        // Call MFC to have it continue processing the message        return CWinThread::PreTranslateMessage(pMsg);}BOOL CThreadMsgApp::InitInstance(){    WPARAM wParam;    LPARAM lParam;    wParam = MAKEWPARAM(0,0); // We can put whatever we    lParam = MAKELPARAM(0,0); // want in wParam & lParam    // Send the user-defined Thread Message    // m_nThreadID is a member of CWinThread that holds the thread ID    PostThreadMessage(m_nThreadID, WM_USER+2268, wParam, lParam);    return TRUE;}void CThreadMsgApp::OnReceivedCommand(WPARAM wParam, LPARAM lParam){    // You can do whatever you want in here, this is simply    // sending output to the debug window    TRACE0("Received WM_USER+2268!!\n");}				
REFERENCES
For more information on the CWinThread object, please see the following:MFC Encyclopedia, Multithreading: Creating User-Interface Threads.
1.00 2.00 2.10 2.20 4.00 4.10
Properties

Article ID: 142415 - Last Review: 12/09/2003 19:42:57 - Revision: 2.0

  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • kbprb kbthread KB142415
Feedback