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
This article has been archived. It is offered "as is" and will no longer be updated.
When code uses the PostThreadMessage() Win32 function, the MFC messagehandlers are not called.
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.
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");}				
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

Article ID: 142415 - Last Review: 12/04/2015 12:58:50 - 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

  • kbnosurvey kbarchive kbprb kbthread KB142415