Windows MessageBox ignoring WM_CLOSE

2019-02-24 22:16发布

We've got a legacy C Windows application which pops up a modal window via the MessageBox call when a fatal connection error occurs. Our network engineers may be running many of these applications at once. Occasionally, a network glitch will cause the connections being handled by these applications to fail simultaneously.

On Windows 7, selecting the 'Close all windows' function from the taskbar does work, because the modal dialog does not appear to be processing the WM_QUIT message. I typically work on Linux systems but my MSDN research indicates that the only way I can catch and process this message is by creating my own dialog and handling the messages myself.

My worry is that I've overlooked an easier solution, can anyone offer alternatives?

2条回答
太酷不给撩
2楼-- · 2019-02-24 22:49

The modal dialog's message loop should catch WM_QUIT and in response call EndDialog() and pass on the WM_QUIT message to the application's main window using PostMessage().


Update:

The approach as proposed above would work, if a WM_QUIT would be sent to the modal dialog ... - but at least on my current win7 machine this isn't the case.

Moreover it is the case that the main window receives a WM_SYSCOMMAND with wParam set to SC_CLOSE and somehow the default message handler does ignore it (which might due to the modal dialog box's styles...? I did not investigated this further.).

However, adding the following branch to the main window's message loop's switch should do the work of ending the application under the conditions describe by the OP:

  ...

  case WM_SYSCOMMAND:
    if (SC_CLOSE == wParam)
    {
      PostQuitMessage(<whatever code shall be returned>);
    }

    return DefWindowProc(...);

  ...
查看更多
\"骚年 ilove
3楼-- · 2019-02-24 22:51

Can be a tricky one this.

Usually, to quit an windows application you have to quit the "Windows message loop". The easiest way to do this is to post a quit message, e.g. PostQuitMessage(retCode), where retCode is a value that your main message loop handler can process. Typically, zero, i.e. ignore.

Typically, PostQuitMessage is posted in response to a WM_DESTROY message.

It really depends on the legacy code, you have my sympathies, I am dealing with legacy code also. My code has a separate message loop and continually displays modal dialog boxes. Call EndDialog and calling PostQuitMessage(0) terminated my application correctly.

查看更多
登录 后发表回答