Windows MessageBox ignoring WM_CLOSE

守給你的承諾、 提交于 2019-12-01 22:42:15

问题


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?


回答1:


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(...);

  ...



回答2:


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.



来源:https://stackoverflow.com/questions/17427103/windows-messagebox-ignoring-wm-close

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!