检测Java应用程序中的windows注销事件

检测Java应用程序中的windows注销事件,java,windows,events,shutdown-hook,Java,Windows,Events,Shutdown Hook,是否有一个库,我可以使用Java来监听用户注销和其他可能的Windows事件?(如果它支持多个平台就更好了!) 我记得几年前读过一本关于这类图书馆的书,但现在似乎找不到了。我见过其他线程使用Python和win32ts做基本相同的事情 如果是免费和/或开源的,也会更好 谢谢 注意:使用Runtime.getRuntime().addShutdownHook(Thread)的候选解决方案不适用于javaw。我仍然在寻找一个可以与javaw一起工作的解决方案。请参阅java bug ID和。谢谢——

是否有一个库,我可以使用Java来监听用户注销和其他可能的Windows事件?(如果它支持多个平台就更好了!)

我记得几年前读过一本关于这类图书馆的书,但现在似乎找不到了。我见过其他线程使用Python和win32ts做基本相同的事情

如果是免费和/或开源的,也会更好

谢谢


注意:使用
Runtime.getRuntime().addShutdownHook(Thread)
的候选解决方案不适用于
javaw
。我仍然在寻找一个可以与javaw一起工作的解决方案。请参阅java bug ID和。谢谢——cam

我最好的猜测是使用。您可以注册一个线程,该线程在JVM关闭后立即被调用

编辑:

如果你想在windows下实现这一点,你可以创建一个不可见的窗口,并在用户注销或系统关闭时对操作系统发送的消息作出反应。

我想你应该看看。这给了您在JVM关闭之前做事情的最后机会。这可以让您检测到所有应用程序都关闭的实际注销,而不是它们只是临时切换用户,让其状态随时可以恢复。但是,作为一个警告,您在关机过程中计划执行的任何操作都需要简短,因为操作系统可能随时在您身上执行SIGKILL(或等效操作),这会立即停止JVM


如果这不是您需要的,那么您可能需要使用JNI来注册本机侦听器。至于其他windows事件,AWT库提供了许多类来实现大多数普通应用程序都感兴趣的侦听器。在这种情况下,您可能会对一个问题感兴趣。

似乎有很多人遇到了这个问题。虽然java项目的人显然不太重视这一点(原始票是在10年前就开放的)。 我已经在bug 4486580中发布了一些成功的解决方案,它使用了隐藏的JWindow。然而,这种变通方法被认为是不可靠的。我还发现了由cowwoc发起的这一小部分讨论,他发布了以下内容:。这种解决方法总比什么都不做要好,但最好在程序完成清理之前阻止windows注销。当流程终止时,您不想中途完成流程


围绕此问题打开的最新错误是67985。这似乎没有引起人们的注意。

不幸的是,在运行时使用关闭钩子在使用javaw时不起作用。这似乎是一个已知的错误,请参阅提供的链接已失效!