我如何能够在不丢失控制台的情况下捕获ctrl c

时间:2014-03-13 00:39:40

标签: visual-c++

在Windows上如何在不丢失C ++控制台的情况下捕获CTRL + C?

当我执行cin时,按下一个数字或按CTRL + C cin它会做同样的事情 - 它会改变输入的位置并重新接受输入。 之后,如果我按CTRL + C并运行mysethandle函数,那么它将进入无限循环。但是,如果我按了数字,它就能正常工作。

如何取消SetConsolCtrlHandler生成的信号并继续cin而不会出现问题?

我的代码是:

// ctrlc.cpp : definisce il punto di ingresso dell'applicazione console.
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int mysethandle(HANDLE stdd, bool x);

int _tmain(int argc, _TCHAR* argv[])
{
    int a,b,c,retu;
    DWORD mode;
    HANDLE stdd = GetStdHandle(STD_INPUT_HANDLE);

    if (stdd == INVALID_HANDLE_VALUE)
    {
        cout << "handle non valido\n";
        return 0;
    }

    GetConsoleMode(stdd, &mode);
    mode &= ~ENABLE_PROCESSED_INPUT;

    primo:
    retu = 0;
    SetConsoleMode(stdd, mode);
    cout << "\ninserisci a: ";
    cin >> a;

    retu = mysethandle(stdd, true);
    if (retu==1) { goto primo; }

    SetConsoleMode(stdd, mode);

    secondo:
    retu = 0;
    cout << "inserisci b: ";
    cin >> b;

    retu = mysethandle(stdd, true);
    if (retu==1) { goto secondo; }

    c=a+b;
    cout << "\n " << a << " + " << b << " = " << c << "\n";
    return 0;
}

int mysethandle(HANDLE stdd, bool x)
{
    if (SetConsoleCtrlHandler(NULL, x))
    {
        cout << "\n HAI PREMUTO CTRL C \n";
        SetConsoleMode(stdd,ENABLE_PROCESSED_INPUT);
        return 1;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

感谢您的链接:http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cpluspl

但老实说,我没有记下3件事

1)我如何关闭信号?

2)为什么cin功能不起作用?

3)当cin功能停用时?