Я знаю с Windows уведомлением, WM_CLOSE означает закрытие окна с помощью кнопки "X" в верхнем правом углу окна.
На самом деле, когда окно щелкают по стандартной кнопке «X» (или, если она включена, выбирается стандартный элемент «Закрыть» в верхнем левом углу окна, или окно получает нажатие клавиши ALT + F4 ), сообщение WM_SYSCOMMAND
выдается окну с wParam
, содержащим флаг SC_CLOSE
. Если это сообщение передается DefWindowProc()
(поведение по умолчанию), оно выдает в окно сообщение WM_CLOSE
.
См. Закрытие окна .
Возможно, что из-за других условий также будет выдано сообщение WM_CLOSE
.
Кто-нибудь знает сообщение с уведомлением о закрытии с помощью File-> Exit?
Что происходит при выборе этого пункта меню, определяется приложением, а не ОС. Приложение может делать все, что захочет, включая немедленное уничтожение окна, если оно того хочет.
Однако при этом, если меню является стандартным меню Win32, то окно получит сообщение WM_COMMAND
, содержащее идентификатор выбранного пункта меню, по крайней мере.
Причина, по которой я спросил, заключается в том, что я пытаюсь реализовать собственный код JNI, чтобы изящно закрыть окно, когда пользователь инициировал выключение системы.
По умолчанию вам ничего не нужно делать для этого. ОС автоматически закрывает все открытые windows во время выключения системы. Вместо того, чтобы закрывать окно вручную, вы должны реагировать на его закрытие, если вам нужно очистить какие-либо ресурсы.
Когда вы нажимаете «X», чтобы закрыть, появляется диалоговое окно подтверждения, которое предотвращает исчезновение сообщения о причине завершения работы (когда я ожидаю, что оно исчезнет через некоторое время).
Тогда приложение неправильно обрабатывает завершение работы системы.
В большинстве приложений отображается такое окно подтверждения в ответ на получение сообщения WM_CLOSE
. Если подтверждение отменяется, приложение отбрасывает сообщение и продолжает работу. Однако приложения не должны запрашивать подтверждение у пользователя во время выключения системы. Но не все приложения следуют этому правилу.
Я знаю, что Файл-> Выход из строки меню не запрашивает подтверждения
Опять же, это решение для приложения. , а не ОС.
как мне реализовать это с помощью windows уведомления? После некоторых поисков я нашел только одно: DestroyWindow.
Правильно. Или вы можете вместо этого отправить сообщение WM_QUIT
в очередь сообщений. См. Функцию PostQuitMessage()
.
Поэтому я попытался закрыть окно с помощью функции DestroyWindow (), но оно только «разрушает» окно, а не завершает все приложение.
Приложение несет ответственность за его завершение, обычно путем выхода из сообщения l oop, когда его главное окно было уничтожено.
Вот мой оператор switch в моей функции WndPro c CallBack :
Нет необходимости отправлять WM_CLOSE
в ответ на WM_QUERYENDSESSION
или WM_ENDSESSION
. Пусть ОС справится с этим за вас.
Если вы не хотите, чтобы подтверждение появлялось во время выключения системы, измените свой код на что-то вроде этого:
bool shuttingDown = false;
LRESULT CALLBACK AppWndProc(
_In_ HWND hWnd,
_In_ UINT message,
_In_ WPARAM wParam,
_In_ LPARAM lParam,
_In_ UINT_PTR uIdSubclass,
_In_ DWORD_PTR dwRefData
) {
switch (message) {
case WM_QUERYENDSESSION:
shuttingDown = true;
break;
case WM_ENDSESSION:
if (wParam == FALSE)
shuttingDown = false;
break;
case WM_CLOSE:
if (shuttingDown) {
DestroyWindow(hWnd);
// or:
// PostQuitMessage(0);
return 0;
}
break;
case WM_NCDESTROY:
RemoveWindowSubclass(hWnd, AppWndProc, uIdSubclass);
break;
}
return DefSubclassProc(hWnd, message, wParam, lParam);
}