C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Как перехватить закрытие Win32 Console / C++ для начинающих / C++

Хороший вопрос. Единственное, что мне приходит в голову - это определить 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;
}