Сервисные приложения, которые взаимодействуют с пользователем, должны быть готовы обработать события выхода из системы. Когда происходит событие выхода из системы, сервисное приложение должно закрыть все дескрипторы оконной станции пользователя и рабочего стола.
Этот фрагмент демонстрирует, как окно сообщения в коде примера взаимодействия должно быть отклонено при выходе из системы. Функция ConsoleCtrlHandler в этом примере - является функцией HandlerRoutine, которая была задана вызовом функции SetConsoleCtrlHandler.
BOOL CALLBACK EnumProc( HWND hwnd, LPARAM lParam) { // отправляем сообщение WM_CLOSE, чтобы разрушить окно, потому что функция DestroyWindow // работает не со всеми потоками. SendMessage(hwnd, WM_CLOSE, 0, 0); return TRUE; } BOOL ConsoleCtrlHandler(DWORD dwCtrlType) { if (dwCtrlType == CTRL_LOGOFF_EVENT && dwGuiThreadId != 0) { SetThreadDesktop(GetThreadDesktop(dwGuiThreadId)); EnumThreadWindows(dwGuiThreadId, EnumProc, 0); } return FALSE; } |