Сервисные приложения, которые взаимодействуют с пользователем, должны быть готовы обработать события выхода из системы. Когда происходит событие выхода из системы, сервисное приложение должно закрыть все дескрипторы оконной станции пользователя и рабочего стола.
Этот фрагмент демонстрирует, как окно сообщения в коде примера взаимодействия должно быть отклонено при выходе из системы. Функция 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;
} |