1// ConsoleClose.cpp 2 3#include "StdAfx.h" 4 5#include "ConsoleClose.h" 6 7static int g_BreakCounter = 0; 8static const int kBreakAbortThreshold = 2; 9 10namespace NConsoleClose { 11 12#if !defined(UNDER_CE) && defined(_WIN32) 13static BOOL WINAPI HandlerRoutine(DWORD ctrlType) 14{ 15 if (ctrlType == CTRL_LOGOFF_EVENT) 16 { 17 // printf("\nCTRL_LOGOFF_EVENT\n"); 18 return TRUE; 19 } 20 21 g_BreakCounter++; 22 if (g_BreakCounter < kBreakAbortThreshold) 23 return TRUE; 24 return FALSE; 25 /* 26 switch(ctrlType) 27 { 28 case CTRL_C_EVENT: 29 case CTRL_BREAK_EVENT: 30 if (g_BreakCounter < kBreakAbortThreshold) 31 return TRUE; 32 } 33 return FALSE; 34 */ 35} 36#endif 37 38bool TestBreakSignal() 39{ 40 #ifdef UNDER_CE 41 return false; 42 #else 43 /* 44 if (g_BreakCounter > 0) 45 return true; 46 */ 47 return (g_BreakCounter > 0); 48 #endif 49} 50 51void CheckCtrlBreak() 52{ 53 if (TestBreakSignal()) 54 throw CCtrlBreakException(); 55} 56 57CCtrlHandlerSetter::CCtrlHandlerSetter() 58{ 59 #if !defined(UNDER_CE) && defined(_WIN32) 60 if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) 61 throw "SetConsoleCtrlHandler fails"; 62 #endif 63} 64 65CCtrlHandlerSetter::~CCtrlHandlerSetter() 66{ 67 #if !defined(UNDER_CE) && defined(_WIN32) 68 if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) 69 throw "SetConsoleCtrlHandler fails"; 70 #endif 71} 72 73} 74