如何在 Windows 上的C++控制台应用程序中捕获 ctrl-c 事件,而不会进入无限循环
How to trap ctrl-c event in a C++ console application on Windows without going into an infinite loop?
我有以下基于控制台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 的状态。
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 热键/按钮,根据需要进行编译,但不运行(在F5和Ctrl+Shift+B之间)
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- Qt 键按事件处理程序仅在按下 ctrl、alt 或 shift 键时做出反应
- Ctrl 左键单击事件捕获QT
- 如何在 Windows 上的C++控制台应用程序中捕获 ctrl-c 事件,而不会进入无限循环
- 将CTRL C事件发送到使用Windows上使用Qprocess启动的过程
- 奇怪的是,双击/鼠标拖动会触发按键事件"CTRL-C"