У меня есть приложение Java, которое я хочу «красиво» завершить, когда пользователь выбирает Пуск-> Завершение работы. Я пробовал использовать прослушиватели выключения JVM через Runtime.addShutdownHook (...), но это не работает, поскольку я не могу использовать какие-либо элементы пользовательского интерфейса из него.
Я также пробовал использовать обработчик выхода в главном окне пользовательского интерфейса приложения, но, насколько я могу судить, у него нет возможности приостановить или остановить завершение работы. Как я могу нормально справиться с выключением?




Насколько я знаю, вам нужно начать использовать JNI для настройки обработчика сообщений для сообщения Windows WM_QUERYENDSESSION.
Для этого (если вы новичок в программировании под Windows, как я) вам необходимо создать новый класс окна с новой функцией обработки сообщений (как описано здесь) и обработать WM_QUERYENDSESSION из обработчика сообщений.
NB: вам нужно будет использовать JNIEnv :: GetJavaVM (...), а затем JavaVM :: AttachCurrentThread (...) в потоке обработки сообщений, прежде чем вы сможете вызывать какие-либо методы Java из вашего собственного кода обработки сообщений.
Ранее упомянутый подход JNI, вероятно, будет работать.
Вы можете использовать JNA, которая, по сути, является оболочкой для JNI, чтобы упростить ее использование. Дополнительным бонусом является то, что он (по крайней мере, на мой взгляд) обычно быстрее и удобнее в обслуживании, чем необработанный JNI. Вы можете найти JNA на https://jna.dev.java.net/
Если вы просто запускаете приложение в меню «Пуск», потому что пытаетесь заставить его вести себя как служба в Windows, вы можете использовать оболочку службы Java, которая находится здесь: http://wrapper.tanukisoftware.org/doc/english/download.jsp
Нашли рабочее решение?