2017-01-08 11 views
0

私は次のC++コンソールベースのアプリケーションをユーザーから無期限に読み取り、ユーザーがコマンド「bye」を入力したときに終了します。無限ループに陥ることなく、WindowsのC++コンソールアプリケーションでctrl-cイベントをトラップする方法はありますか?

ターゲットプラットフォームは、Windowsで、使用しているコンパイラは、私が何をしようとしているMS Visual Studioのエンタープライズ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()を介してシェル "しかし、それは何が起こっているのではなく、プログラムは無限ループに行く代わりに。

私の目的は、ユーザがctrl-cを押してコンソールアプリケーションを終了できるようにすることではなく、ユーザがコマンド「bye」を入力したときに終了することです。

コンソールウィンドウでイベントctrl-cをすべて無効にすることはできますか?

あなたのご意見をいただければ幸いです。

+1

_私の目的は、ctrl-cを押してコンソールアプリケーションを終了させることではなく、ユーザーが "bye"コマンドを入力したときに終了することです。あなたは、一般的なコンピュータ動作と標準的なコンピュータ動作をブロックしています。どうして? –

+0

...しかし、あなたが主張している場合:_ "[NULLとTRUE引数を指定してSetConsoleCtrlHandlerを呼び出すと、呼び出したプロセスがCTRL + Cシグナルを無視する](https://msdn.microsoft.com/en-us/library/windows) /desktop/ms686016%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396) "_。マニュアルを読むだけです。 –

+0

私はドキュメントを知っているので、SetConsoleCtrlHandler(NULL、TRUE)を設定すると、プログラムは無限ループに入ります。 – Xigma

答えて

1

)それは私が旗cin.fail()cin.eof()をチェックする必要があることが判明し、それらのいずれかが設定されている場合、私は(cin.clearとCINの状態をクリアします

関連する問題