ConsoleClose.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // ConsoleClose.cpp
  2. #include "StdAfx.h"
  3. #include "ConsoleClose.h"
  4. static int g_BreakCounter = 0;
  5. static const int kBreakAbortThreshold = 2;
  6. namespace NConsoleClose {
  7. static BOOL WINAPI HandlerRoutine(DWORD ctrlType)
  8. {
  9. if (ctrlType == CTRL_LOGOFF_EVENT)
  10. {
  11. // printf("\nCTRL_LOGOFF_EVENT\n");
  12. return TRUE;
  13. }
  14. g_BreakCounter++;
  15. if (g_BreakCounter < kBreakAbortThreshold)
  16. return TRUE;
  17. return FALSE;
  18. /*
  19. switch(ctrlType)
  20. {
  21. case CTRL_C_EVENT:
  22. case CTRL_BREAK_EVENT:
  23. if (g_BreakCounter < kBreakAbortThreshold)
  24. return TRUE;
  25. }
  26. return FALSE;
  27. */
  28. }
  29. bool TestBreakSignal()
  30. {
  31. /*
  32. if (g_BreakCounter > 0)
  33. return true;
  34. */
  35. return (g_BreakCounter > 0);
  36. }
  37. void CheckCtrlBreak()
  38. {
  39. if (TestBreakSignal())
  40. throw CCtrlBreakException();
  41. }
  42. CCtrlHandlerSetter::CCtrlHandlerSetter()
  43. {
  44. if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE))
  45. throw "SetConsoleCtrlHandler fails";
  46. }
  47. CCtrlHandlerSetter::~CCtrlHandlerSetter()
  48. {
  49. if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE))
  50. throw "SetConsoleCtrlHandler fails";
  51. }
  52. }