2016-11-11 47 views
0

因此,我已經在Visual Studio中開發了一個C++控制檯應用程序,用信用卡讀卡器記錄出勤記錄,然後吐出一個.csv文件。但是,由於該程序現在正在運行,用戶必須手動鍵入「退出」才能成功關閉程序並生成.csv。如何在用戶按下C++控制檯應用程序中的關閉按鈕時執行程序清理?

我知道非技術人員不會意識到這一點,只能點擊X按鈕並丟失數據。有什麼方法可以捕捉信號並讓程序執行清理工作並關閉?

這個程序已經是Windows了,所以這不是問題。

回答

0

使用SetConsoleCtrlHandler爲按下窗口標題關閉「X」按鈕時引發的CTRL_CLOSE_EVENT事件設置回調。

注意,按Ctrl + Ç事件不同的是:這是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 + Ç),但是,據我所知,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 
} 
+0

我熟悉SIGINT和其他終止信號。這是否類似? – Koronakesh

+0

@Koronakesh是的,它們在概念上是相同的,除了'SetConsoleCtrlHandler'提供了更多的功能並且是特定於平臺的。 – Dai

相關問題