如何使我的Java应用程序在Windows中正常关闭?

如何使我的Java应用程序在Windows中正常关闭?

How do I get my Java application to shutdown nicely in windows?

我有一个Java应用程序,当用户选择Start-> Shutdown时,我想"很好地"关闭它。 我已经尝试通过Runtime.addShutdownHook(...)使用JVM关闭侦听器,但这无法正常工作,因为我无法使用其中的任何UI元素。

我还尝试在主应用程序UI窗口上使用退出处理程序,但据我所知,它无法暂停或停止关闭。 我怎样才能很好地处理关机?


前面提到的JNI方法可能会起作用。

您可以使用JNA,它基本上是JNI的包装,以使其易于使用。另外一个好处是(至少在我看来)它比原始JNI更快,更可维护。您可以在https://jna.dev.java.net/上找到JNA。

如果只是因为要使它像Windows中的服务一样在开始菜单中启动该应用程序,则可以使用以下Java服务包装器:
http://wrapper.tanukisoftware.org/doc/english/download.jsp


据我所知,您需要开始使用JNI来为Windows WM_QUERYENDSESSION消息设置消息处理程序。

为此(如果您像我这样不熟悉Windows编程,则需要使用新的消息处理功能(如此处所述)创建一个新的窗口类,并从消息处理程序中处理WM_QUERYENDSESSION。

注意:您需要先在消息处理线程上使用JNIEnv :: GetJavaVM(...),然后再使用JavaVM :: AttachCurrentThread(...),然后才能从本地消息处理代码中调用任何Java方法。


推荐阅读