我有一个WinAPI / Win32应用程序,该应用程序还在打开主窗口之前也打开了一个控制台窗口(出于调试目的)。我添加了一个安全检查,以便在按下主窗口的X按钮时询问“您确定吗?”事情。但是,如果我在控制台上单击X,它将立即终止该应用程序,而不会发生任何问题。有什么办法可以防止这种情况? 这是我的代码段:
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();
答案 0 :(得分:0)
我相信您需要调用SetConsoleCtrlHandler
以提供一个处理程序例程来处理关闭事件。像这样:
BOOL WINAPI MyCtrlHandler (DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
...
}
SetConsoleCtrlHandler (MyCtrlHandler, TRUE);
您可能想以各种方式处理dwCtrlType
的各种值。有关详细信息,请查阅documentation。
答案 1 :(得分:0)
您可以disable the close button进入控制台窗口,以防止意外终止应用程序:
template <unsigned int n, unsigned int ...n_next,
typename T, typename ...Ts>
void Print(T & t, Ts & ... ts)
{
for(int i = 0; i < n; i++)
{
std::cout << t << " ";
}
std::cout << std::endl;
Print<n_next..., ts...>(ts...);
}
template <unsigned int n, typename T>
void Print(T & t)
{
for(int i = 0; i < n; i++)
{
std::cout << t << " ";
}
std::cout << std::endl;
}