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