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

How to trap ctrl-c event in a C++ console application on Windows without going into an infinite loop?

本文关键字:事件 ctrl-c 无限循环 Windows 上的 C++ 应用程序 控制台      更新时间:2023-10-16

我有以下基于控制台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都会抓住它"通过ReadInput()重新打开shell",但是,这不是正在发生的事情,程序进入无限循环。

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

是否可以为我的控制台窗口同时禁用事件 ctrl-c?

非常感谢

您的意见。

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