Про Линукс:
Сынишка подходит с дискеткой к папашке-линуксоиду и говорит:
- Пап, а проиграй как мне этот .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.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS