// ConsoleClose.cpp | |
#include "StdAfx.h" | |
#include "ConsoleClose.h" | |
static int g_BreakCounter = 0; | |
static const int kBreakAbortThreshold = 2; | |
namespace NConsoleClose { | |
#if !defined(UNDER_CE) && defined(_WIN32) | |
static BOOL WINAPI HandlerRoutine(DWORD ctrlType) | |
{ | |
if (ctrlType == CTRL_LOGOFF_EVENT) | |
{ | |
// printf("\nCTRL_LOGOFF_EVENT\n"); | |
return TRUE; | |
} | |
g_BreakCounter++; | |
if (g_BreakCounter < kBreakAbortThreshold) | |
return TRUE; | |
return FALSE; | |
/* | |
switch(ctrlType) | |
{ | |
case CTRL_C_EVENT: | |
case CTRL_BREAK_EVENT: | |
if (g_BreakCounter < kBreakAbortThreshold) | |
return TRUE; | |
} | |
return FALSE; | |
*/ | |
} | |
#endif | |
bool TestBreakSignal() | |
{ | |
#ifdef UNDER_CE | |
return false; | |
#else | |
/* | |
if (g_BreakCounter > 0) | |
return true; | |
*/ | |
return (g_BreakCounter > 0); | |
#endif | |
} | |
void CheckCtrlBreak() | |
{ | |
if (TestBreakSignal()) | |
throw CCtrlBreakException(); | |
} | |
CCtrlHandlerSetter::CCtrlHandlerSetter() | |
{ | |
#if !defined(UNDER_CE) && defined(_WIN32) | |
if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) | |
throw "SetConsoleCtrlHandler fails"; | |
#endif | |
} | |
CCtrlHandlerSetter::~CCtrlHandlerSetter() | |
{ | |
#if !defined(UNDER_CE) && defined(_WIN32) | |
if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) | |
throw "SetConsoleCtrlHandler fails"; | |
#endif | |
} | |
} |