我有一个Java应用程序,当用户选择Start-> Shutdown时,我想“很好地”关闭它。我已经尝试通过Runtime.addShutdownHook(...)使用JVM关闭监听器,但这不起作用,因为我不能使用它的任何UI元素。
我也尝试在我的主应用程序UI窗口上使用退出处理程序,但据我所知,它无法暂停或停止关机。我怎样才能很好地处理关机?
答案 0 :(得分:3)
据我所知,您需要开始使用JNI为Windows WM_QUERYENDSESSION消息设置消息处理程序。
要做到这一点(如果你是像我这样的Windows编程的新手),你需要创建一个带有新消息处理函数的新类窗口(如here所述)并处理来自的WM_QUERYENDSESSION消息处理程序。
注意:在您可以从本机消息处理代码调用任何Java方法之前,您需要在消息处理线程上使用JNIEnv :: GetJavaVM(...)然后使用JavaVM :: AttachCurrentThread(...) 。
答案 1 :(得分:3)
前面提到的JNI方法可能会有效。
您可以使用JNA,它基本上是JNI的包装器,使其更易于使用。另一个好处是,它(至少在我看来)通常比原始JNI更快,更易于维护。您可以在https://jna.dev.java.net/
找到JNA如果您只是在开始菜单中启动应用程序,因为您尝试使其在Windows中的行为类似于服务,则可以使用此处的java服务包装器: http://wrapper.tanukisoftware.org/doc/english/download.jsp