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

时间:2009-02-04 18:02:04

标签: java windows events shutdown-hook

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

我记得几年前读过这种类似的图书馆,但现在似乎无法找到它。我已经看到其他线程使用带有win32ts的Python基本上做同样的事情。

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

感谢。

注意:使用Runtime.getRuntime().addShutdownHook(Thread)的候选解决方案无法与javaw一起正常使用。我仍然在寻找一种适用于javaw的解决方案。请参阅java bug ids 44865804302814。谢谢--cam

3 个答案:

答案 0 :(得分:7)

我想你想看看Runtime.addShutdownHook()。这为您提供了在JVM关闭之前完成工作的最后机会。这使您可以检测所有应用程序关闭的实际注销,但不是它们只是临时切换用户,而是让状态准备好返回。但是,作为一个警告,无论您在关机过程中计划做什么都需要简短,因为操作系统可能随时对您进行SIGKILL(或等效操作),这会立即停止JVM。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

似乎有很多人遇到了这个问题。虽然,Java项目中的人显然不会考虑这个优先级(原始票据大约在10年前开放)。

我在使用隐藏的JWindow的bug 4486580中发布的解决方法取得了一些成功。但是,这种解决方法被认为是不可靠的。我还发现了由发布该解决方案的cowwoc开始的这一点讨论:http://forums.java.net/jive/thread.jspa?threadID=46716。这种解决方法总比没有好,但是在程序确定完成清理之前阻止Windows注销会很好。当流程终止时,您不希望成为流程的一部分。

围绕这个问题打开的最新错误是6798985.它似乎已经被忽视了。