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?
The modal dialog's message loop should catch
WM_QUIT
and in response callEndDialog()
and pass on theWM_QUIT
message to the application's main window usingPostMessage()
.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
withwParam
set toSC_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: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.