关闭控制台时防止应用程序关闭

时间:2018-11-24 21:38:19

标签: c++ winapi

我有一个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();

2 个答案:

答案 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;
}