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