Prevent application from closing when closing console
I have a WinAPI/Win32 application that also opens a console window (with debugging purposes) before the main window is opened). I added a safe check for when the main window gets its X button pressed it asks the "Are you sure?" thing. However, if I click X on the console, it kills the application right away without asking anything. Is there any way to prevent that?
Here is a snippet of my code:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
EnableDebug();
WNDCLASSA MainWindow = { 0 };
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
MainWindow.lpszClassName = "WindowClass";
MainWindow.lpfnWndProc = WndProc;
ATOM result = RegisterClassA(&MainWindow);
if (!result)
{
MessageBoxA(NULL, "Failed to register window class", "Error", MB_OK);
return -1;
}
MSG msg = { 0 };
//here the app goes on
//here is the start of the debug function
void EnableDebug(){
if (AllocConsole() == 0)
{
MessageBoxA(NULL, "Unable to create a debug window!", "Error", MB_OK);
return;
}
freopen("CONOUT$", "w", stderr);
SetConsoleTitleA("Debug Window");
clog.clear();
c++ winapi
|
show 2 more comments
I have a WinAPI/Win32 application that also opens a console window (with debugging purposes) before the main window is opened). I added a safe check for when the main window gets its X button pressed it asks the "Are you sure?" thing. However, if I click X on the console, it kills the application right away without asking anything. Is there any way to prevent that?
Here is a snippet of my code:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
EnableDebug();
WNDCLASSA MainWindow = { 0 };
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
MainWindow.lpszClassName = "WindowClass";
MainWindow.lpfnWndProc = WndProc;
ATOM result = RegisterClassA(&MainWindow);
if (!result)
{
MessageBoxA(NULL, "Failed to register window class", "Error", MB_OK);
return -1;
}
MSG msg = { 0 };
//here the app goes on
//here is the start of the debug function
void EnableDebug(){
if (AllocConsole() == 0)
{
MessageBoxA(NULL, "Unable to create a debug window!", "Error", MB_OK);
return;
}
freopen("CONOUT$", "w", stderr);
SetConsoleTitleA("Debug Window");
clog.clear();
c++ winapi
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
1
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
1
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,WC_EDIT
windows) and printf to it for debugging
– RbMm
Nov 25 '18 at 9:04
|
show 2 more comments
I have a WinAPI/Win32 application that also opens a console window (with debugging purposes) before the main window is opened). I added a safe check for when the main window gets its X button pressed it asks the "Are you sure?" thing. However, if I click X on the console, it kills the application right away without asking anything. Is there any way to prevent that?
Here is a snippet of my code:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
EnableDebug();
WNDCLASSA MainWindow = { 0 };
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
MainWindow.lpszClassName = "WindowClass";
MainWindow.lpfnWndProc = WndProc;
ATOM result = RegisterClassA(&MainWindow);
if (!result)
{
MessageBoxA(NULL, "Failed to register window class", "Error", MB_OK);
return -1;
}
MSG msg = { 0 };
//here the app goes on
//here is the start of the debug function
void EnableDebug(){
if (AllocConsole() == 0)
{
MessageBoxA(NULL, "Unable to create a debug window!", "Error", MB_OK);
return;
}
freopen("CONOUT$", "w", stderr);
SetConsoleTitleA("Debug Window");
clog.clear();
c++ winapi
I have a WinAPI/Win32 application that also opens a console window (with debugging purposes) before the main window is opened). I added a safe check for when the main window gets its X button pressed it asks the "Are you sure?" thing. However, if I click X on the console, it kills the application right away without asking anything. Is there any way to prevent that?
Here is a snippet of my code:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
EnableDebug();
WNDCLASSA MainWindow = { 0 };
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
MainWindow.lpszClassName = "WindowClass";
MainWindow.lpfnWndProc = WndProc;
ATOM result = RegisterClassA(&MainWindow);
if (!result)
{
MessageBoxA(NULL, "Failed to register window class", "Error", MB_OK);
return -1;
}
MSG msg = { 0 };
//here the app goes on
//here is the start of the debug function
void EnableDebug(){
if (AllocConsole() == 0)
{
MessageBoxA(NULL, "Unable to create a debug window!", "Error", MB_OK);
return;
}
freopen("CONOUT$", "w", stderr);
SetConsoleTitleA("Debug Window");
clog.clear();
c++ winapi
c++ winapi
asked Nov 24 '18 at 21:38
DarkAtomDarkAtom
214
214
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
1
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
1
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,WC_EDIT
windows) and printf to it for debugging
– RbMm
Nov 25 '18 at 9:04
|
show 2 more comments
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
1
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
1
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,WC_EDIT
windows) and printf to it for debugging
– RbMm
Nov 25 '18 at 9:04
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
1
1
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
1
1
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,
WC_EDIT
windows) and printf to it for debugging– RbMm
Nov 25 '18 at 9:04
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,
WC_EDIT
windows) and printf to it for debugging– RbMm
Nov 25 '18 at 9:04
|
show 2 more comments
2 Answers
2
active
oldest
votes
I believe you need to call SetConsoleCtrlHandler
to provide a handler routine to handle the close event. Something like this:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
You probably want to handle various values of dwCtrlType
in various ways. Consult the documentation for details.
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external callTerminateProcess
withSTATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…
– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
|
show 2 more comments
You can disable the close button of the console window to prevent accidentally terminating your application:
if( HWND hwnd = GetConsoleWindow() )
{
if( HMENU hMenu = GetSystemMenu( hwnd, FALSE ) )
{
EnableMenuItem( hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462590%2fprevent-application-from-closing-when-closing-console%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I believe you need to call SetConsoleCtrlHandler
to provide a handler routine to handle the close event. Something like this:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
You probably want to handle various values of dwCtrlType
in various ways. Consult the documentation for details.
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external callTerminateProcess
withSTATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…
– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
|
show 2 more comments
I believe you need to call SetConsoleCtrlHandler
to provide a handler routine to handle the close event. Something like this:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
You probably want to handle various values of dwCtrlType
in various ways. Consult the documentation for details.
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external callTerminateProcess
withSTATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…
– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
|
show 2 more comments
I believe you need to call SetConsoleCtrlHandler
to provide a handler routine to handle the close event. Something like this:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
You probably want to handle various values of dwCtrlType
in various ways. Consult the documentation for details.
I believe you need to call SetConsoleCtrlHandler
to provide a handler routine to handle the close event. Something like this:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
You probably want to handle various values of dwCtrlType
in various ways. Consult the documentation for details.
answered Nov 24 '18 at 22:01
Paul SandersPaul Sanders
5,2512621
5,2512621
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external callTerminateProcess
withSTATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…
– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
|
show 2 more comments
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external callTerminateProcess
withSTATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…
– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
unfortunately this is not work. event if you not exit from app on close console event, after several seconds process will be force terminated external
– RbMm
Nov 24 '18 at 22:26
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
@RbMm OK, thanks. That's sad.
– Paul Sanders
Nov 24 '18 at 22:27
csrss.exe external call
TerminateProcess
with STATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…– RbMm
Nov 24 '18 at 22:39
csrss.exe external call
TerminateProcess
with STATUS_CONTROL_C_EXIT
- stackoverflow.com/questions/26404907/…– RbMm
Nov 24 '18 at 22:39
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
disabling the X button on the console could also be an option, but I think that is not possible.
– DarkAtom
Nov 24 '18 at 23:09
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
@DarkAtom It is possible, see my answer.
– zett42
Nov 25 '18 at 16:39
|
show 2 more comments
You can disable the close button of the console window to prevent accidentally terminating your application:
if( HWND hwnd = GetConsoleWindow() )
{
if( HMENU hMenu = GetSystemMenu( hwnd, FALSE ) )
{
EnableMenuItem( hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
}
add a comment |
You can disable the close button of the console window to prevent accidentally terminating your application:
if( HWND hwnd = GetConsoleWindow() )
{
if( HMENU hMenu = GetSystemMenu( hwnd, FALSE ) )
{
EnableMenuItem( hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
}
add a comment |
You can disable the close button of the console window to prevent accidentally terminating your application:
if( HWND hwnd = GetConsoleWindow() )
{
if( HMENU hMenu = GetSystemMenu( hwnd, FALSE ) )
{
EnableMenuItem( hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
}
You can disable the close button of the console window to prevent accidentally terminating your application:
if( HWND hwnd = GetConsoleWindow() )
{
if( HMENU hMenu = GetSystemMenu( hwnd, FALSE ) )
{
EnableMenuItem( hMenu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
}
answered Nov 25 '18 at 16:38
zett42zett42
7,3733740
7,3733740
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462590%2fprevent-application-from-closing-when-closing-console%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Start your program in the background in 1st place?
– πάντα ῥεῖ
Nov 24 '18 at 21:45
What value is that incomplete, useless snippet of code supposed to provide?
– Ken White
Nov 24 '18 at 21:53
1
What problem are you trying to solve? This question is merely asking, how to fix your proposed solution.
– IInspectable
Nov 24 '18 at 22:00
it seems you didn't understand the question. The snippet of code shows how I start my application and the console window. What I am asking is how to make the application not close when I close the console.
– DarkAtom
Nov 24 '18 at 22:24
1
if you create console only for debugging purposes - you easy can create usual window in your process (say create separate thread,
WC_EDIT
windows) and printf to it for debugging– RbMm
Nov 25 '18 at 9:04