Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна

Delphi , ОС и Железо , Windows

Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна

Автор: Nomadic

Про Линукс:
Сынишка подходит с дискеткой к папашке-линуксоиду и говорит:
- Пап, а проиграй как мне этот .wav-ик...
- Ща сынок, только в ядро поддержку саунда вкомпилю...

Используй GetMessage(), в качестве HWND окна пиши NULL (на Паскале - 0). Если в очереди сообщений следующее - WM_QUIT, то эта функция фозвращает FALSE. Если ты пишешь программу для Win32, то запихни это в отдельный поток, организующий выход из программы.

Перевод:

Чтобы корректно поймать сигнал события выхода операционной системы в программе без окна, вы можете использовать функцию GetMessage с нулевым handle окна (0 на Pascal) и проверять сообщение WM_QUIT.

Вот пример кода для C/C++:

#include <windows.h>

// Создать поток для приема сообщений WM_QUIT
DWORD WINAPI ExitThread(LPVOID lpParameter)
{
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        if (msg.message == WM_QUIT)
        {
            // Программа хочет выйти, выполнить очистку и завершение
            return 1; // или любое другое значение, указывающее успешный выход
        }
    }
    return 0;
}

int main()
{
    // Создать поток, который будет принимать сообщения WM_QUIT
    HANDLE hThread = CreateThread(NULL, 0, ExitThread, NULL, 0, NULL);

    // Выполнить логику программы...

    // Отправить сообщение WM_QUIT в поток (будет получено GetMessage)
    SendMessageTimeout(hThread, WM_QUIT, 0, 0, SMTO_ABORTIFHUNG, 10000, NULL);

    // Ожидать завершения потока
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);

    return 0;
}

В этом примере создается отдельный поток для приема сообщений WM_QUIT с помощью функции GetMessage. Когда программа хочет выйти, она отправляет сообщение WM_QUIT в поток с помощью SendMessageTimeout. Поток будет получать сообщение и выполнять любую необходимую очистку перед выходом.

Обратите внимание, что на Linux можно использовать сигналы (например, SIGINT, SIGTERM) вместо сообщений для обнаружения завершения программы. Однако это требует дополнительной обработки обработчиков сигналов и может не быть столь прямым, как использование GetMessage на Windows.

Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна, можно использовать функцию GetMessage() с параметром HWND NULL (0) на платформе Win32.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Windows ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 11:31:36/0.0062179565429688/0