【问题标题】:How to perform program cleanup when user presses close button in C++ console app? [duplicate]当用户在 C++ 控制台应用程序中按下关闭按钮时如何执行程序清理? [复制]
【发布时间】:2017-03-25 04:06:42
【问题描述】:

所以我在 Visual Studio 中开发了一个 C++ 控制台应用程序,用信用卡读卡器记录出勤记录,然后输出一个 .csv 文件。但是,由于程序现在是这样,用户必须手动键入“退出”才能成功关闭程序并生成 .csv。

我知道非技术人员不会意识到这一点,他们可能会点击 X 按钮并丢失他们的数据。有什么办法可以捕捉到信号并让程序进行清理工作并关闭?

该程序已经是仅限 Windows 的,所以这不是问题。

【问题讨论】:

    标签: c++ visual-studio console-application


    【解决方案1】:

    使用SetConsoleCtrlHandler 为按下窗口标题关闭“X”按钮时引发的CTRL_CLOSE_EVENT 事件设置回调。

    请注意,Ctrl+C 事件是不同的:那是 CTRL_C_EVENT,但您以相同的方式处理它:Handle CTRL+C on Win32

    #include <Windows.h>
    
    BOOL onConsoleEvent(DWORD event) {
    
        switch( event ) {
            case CTRL_C_EVENT:
            case CTRL_CLOSE_EVENT:
                // do stuff
                break;
        }
    
        return TRUE;
    }
    
    int main(int argc, char* argv[]) {
    
        if( !SetConsoleCtrlHandler( onConsoleEvent, TRUE ) ) {
            // die
        }
    
        // do stuff
    }
    

    正如您所说,这是特定于 Windows 的。这应该不是问题。

    请注意,您可以使用可移植的signal 函数为SIGINT 事件(对应于Ctrl+C)设置处理程序,据我所知,Windows 的 signal 函数没有对应于 X 按钮的回调事件,因此您必须使用 SetConsoleCtrlHandler

    #include <signal.h> // use `<cstdlib>` in C++
    
    void onSigint(int value) {
        // do stuff
    }
    
    int main(int argc, char* argv[]) {
    
        signal(SIGINT, onSigint);
    
        // do stuff
    }
    

    【讨论】:

    • 我对 SIGINT 和其他终止信号之类的东西很熟悉。这相似吗?
    • @Koronakesh 是的,它们在概念上是相同的,除了 SetConsoleCtrlHandler 提供更多功能并且是特定于平台的。
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2011-06-24
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多