Как перехватить закрытие Win32 Console

Хороший вопрос. Единственное, что мне приходит в голову - это определить HWND консольного окна, хукнуть его оконную процедуру и поймать WM_SYSCOMMAND с параметром SC_CLOSE. Не совсем понятно, что при этом делать однако же Но попробовать можно

На самом деле оказалось гораздо проще:


#include <windows.h>
#include <stdio.h>
#include <conio.h>

HANDLE g_hEvent = 0;

BOOL WINAPI HandlerRoutine(
  DWORD dwCtrlType   //  control signal type
)
{
  if (!g_hEvent)
    return FALSE;

  switch (dwCtrlType)
  {
    case CTRL_C_EVENT:
      printf ("Ctrl+C pressed");
      SetEvent (g_hEvent);
      break;
    case CTRL_BREAK_EVENT:
      printf ("Ctrl+Break pressed");
      SetEvent (g_hEvent);
      break;
    case CTRL_CLOSE_EVENT:
      printf ("Close pressed");
      SetEvent (g_hEvent);
      break;
    case CTRL_LOGOFF_EVENT:
      printf ("User logoff");
      SetEvent (g_hEvent);
      break;
    case CTRL_SHUTDOWN_EVENT:
      printf ("System shutdown");
      SetEvent (g_hEvent);
      break;
  }

  return TRUE; // as we handle the event
}

int main(int argc, char* argv[])
{
  g_hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
  SetConsoleCtrlHandler (HandlerRoutine, TRUE);

  if (g_hEvent)
  {  
    printf ("Waiting for the window to close...\n");
    WaitForSingleObject (g_hEvent, INFINITE);
    CloseHandle (g_hEvent);
  }
  else
    printf ("Error creating event\n");

  printf ("\nPress any key to exit!");
  getch ();

  SetConsoleCtrlHandler (HandlerRoutine, FALSE);
    return 0;
}