64 lines
1.0 KiB
C++
64 lines
1.0 KiB
C++
// ConsoleClose.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "ConsoleClose.h"
|
|
|
|
static int g_BreakCounter = 0;
|
|
static const int kBreakAbortThreshold = 2;
|
|
|
|
namespace NConsoleClose {
|
|
|
|
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;
|
|
*/
|
|
}
|
|
|
|
bool TestBreakSignal()
|
|
{
|
|
/*
|
|
if (g_BreakCounter > 0)
|
|
return true;
|
|
*/
|
|
return (g_BreakCounter > 0);
|
|
}
|
|
|
|
void CheckCtrlBreak()
|
|
{
|
|
if (TestBreakSignal())
|
|
throw CCtrlBreakException();
|
|
}
|
|
|
|
CCtrlHandlerSetter::CCtrlHandlerSetter()
|
|
{
|
|
if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE))
|
|
throw "SetConsoleCtrlHandler fails";
|
|
}
|
|
|
|
CCtrlHandlerSetter::~CCtrlHandlerSetter()
|
|
{
|
|
if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE))
|
|
throw "SetConsoleCtrlHandler fails";
|
|
}
|
|
|
|
}
|