如何在Windows上的C ++控制台应用程序中捕获ctrl-c事件而不进入无限循环?

时间:2017-01-08 03:13:16

标签: c++ windows event-handling

我有以下基于C ++控制台的应用程序,它无限期地从用户读取,并且仅在用户键入命令" bye"时终止。

目标平台是Windows,使用的编译器是MS Visual Studio Enterprise 2015。

#include <windows.h> 
#include <stdio.h> 
#include <iostream>
#include <string>

using namespace std;

void ReadInput(void)
{
    string x;

    while (x != "bye")
    {
        getline(cin, x);
        cout << x << endl;
    }
}

BOOL CtrlHandler(DWORD fdwCtrlType)
{
    switch (fdwCtrlType)
    {
    case CTRL_C_EVENT:
        ReadInput();
        return TRUE;

    default:
        return FALSE;
    }
}

int main(void)
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
    ReadInput();

    return 0;
} 

我试图做的是每当用户按下ctr-c时,CtrlHandler会抓住它&#34;通过ReadInput()&#34;重新打开shell,然而,这就是&#34; s不是发生了什么,程序进入无限循环。

我的目标是不允许用户通过按ctrl-c终止控制台应用程序,它应该仅在用户键入命令&#34; bye&#34;时终止。

甚至可以为控制台窗口一起禁用事件ctrl-c吗?

非常感谢您的意见。

1 个答案:

答案 0 :(得分:1)

事实证明我需要检查标志 cin.fail() cin.eof(),如果设置了其中任何一个,我清除cin的状态为 cin.clear()