Microsoft KB Archive/136391

= FIX: MessageBox with NULL Owner and MB_TASKMODAL =

Article ID: 136391

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.1

 Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q136391

<div class="symptoms_section">

SYMPTOMS
Using ::MessageBox in an application built with the Software Development Kit (SDK) with a NULL owner window and MB_TASKMODAL disables all top-level windows belonging to a task, as if it were a modal dialog box.

MFC, however, allows the main window to be re-enabled when clicked. For example, if you use the following function call to bring up the message box, when you run the application, if you click one of the application's windows, the main window moves to the foreground and is enabled. ::MessageBox(NULL,               "Test",                "Test",                MB_OK | MB_TASKMODAL);

<div class="cause_section">

CAUSE
The problem is due to "enable on activate" code in CFrameWnd that activates a window when it is clicked, even if it was disabled. This works around the Windows bug where clicking on the owner of a modal dialog box doesn't activate the dialog box instead.

Because MFC doesn't recognize the MessageBox as a popup belonging to the application, it will eventually call CWnd::EnableWindow(TRUE). This can be seen in the relevant portions of the call stack below: ... CWnd::EnableWindow(TRUE) _AfxHandleActivate(...) WM_ACTIVATE message is sent. ... CWnd::SetForegroundWindow _AfxHandleSetCursor(...)          //popups checked here. WM_SETCURSOR message is sent. ... The most recently called function is at the top of the list.

<div class="resolution_section">

RESOLUTION
To work around this problem, use CWnd::MessageBox or AfxMessageBox instead of ::MessageBox. If you must use ::MessageBox, specify a window as the owner rather than using NULL as the first parameter. For example, to specify the application's main window as the owner, use this code: ::MessageBox(AfxGetMainWnd->m_hWnd,            "Test",             "Test",             MB_OK | MB_TASKMODAL);

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was fixed in Visual C++ versions 4.2 and later.

Additional query words: 2.00 2.10 3.00 3.10 4.00 4.10 MessageBox Modeless

Keywords: kbbug kbfix kbui KB136391

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.