Перехват WM_CLOSE для операций очистки - PullRequest
2 голосов
/ 02 января 2012

У меня есть внешнее приложение, которое вызывает мое приложение и должно завершить его, когда работа будет завершена.Журнал из этого внешнего приложения утверждает, что он использует WM_CLOSE в моем приложении.

Как я могу перехватить сообщение WM_CLOSE в моем приложении, чтобы выполнить некоторые операции очистки?Я попытался at_exit() и обернул его в классе, но я думаю, что у меня неправильный подход.

Ответы [ 4 ]

3 голосов
/ 02 января 2012

Официальным решением для консольных приложений является HandlerRoutine, обратный вызов установлен SetConsoleCtrlHandler.Windows вызовет ваш обработчик с аргументом CTRL_CLOSE_EVENT в случае выхода WM_CLOSE.

Когда вы используете метод класса с SetConsoleCtrlHandler, это должен быть метод static - Windows выигралане предоставляет вам указатель this.

2 голосов
/ 02 января 2012

Вы можете просто обработать WM_CLOSE в вашем цикле сообщений, чтобы выполнить необходимую очистку или даже прервать закрытие (возвращая 1 вместо 0). Смотрите, например это: http://cboard.cprogramming.com/windows-programming/141438-handling-wm_close-wm_destroy.html#post1056273

Редактировать: для консольных приложений это может представлять интерес: http://support.microsoft.com/kb/178893

2 голосов
/ 02 января 2012

Вы должны создать скрытое окно, используя winapi, и обработать сообщение WM_CLOSE в его цикле сообщений.Использует ли ваше приложение какие-либо элементы графического интерфейса?

1 голос
/ 03 января 2012

Я думаю, что самый простой способ - время от времени вызывать PeekMessage .

BOOL IsCloseEventReceived()
{
    MSG msg;
    return PeekMessage(&msg, NULL, WM_CLOSE, WM_CLOSE, PM_NOREMOVE);
}

Эта функция должна работать, чтобы проверить, было ли отправлено сообщение WM_CLOSE.Это не блокировка, и вам нужно будет звонить на регулярной основе.

Я могу ошибаться, но я думаю, что вам не нужно скрытое окно для обработки сообщений, очередь сообщений присоединяется к вашему процессу при первом вызове функции, связанной с сообщениями, такой как PeekMessage.Однако, если вы получите сообщение WM_CLOSE до вашего первого вызова этой функции, оно может быть потеряно.

...