2009-02-04 86 views
2

是否有可以与Java一起使用的库来侦听用户注销以及可能的其他Windows事件? (如果它支持多种平台,效果会更好!)在Java应用程序中检测Windows注销事件

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

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

谢谢。

注意:使用Runtime.getRuntime().addShutdownHook(Thread)的候选解决方案无法正常使用javaw。我仍然在寻找一个可以与javaw一起工作的解决方案。参见java bug ids 44865804302814。谢谢--cam

回答

7

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

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

+0

不幸的是,这在使用javaw时不起作用。 – 2009-02-05 17:42:35

3

我最好的猜测是使用ShutdownHook。只要JVM关闭,你就可以注册一个被调用的线程。

编辑:
如果要实现这个窗口下,您可以创建一个不可见的窗口,并在其上由操作系统在用户注销或关闭系统发送的WM_QUERYENDSESSION消息作出反应。

+0

不幸的是,在运行时使用关机挂钩在使用javaw时不起作用。 – 2009-02-05 17:43:22

+1

这似乎是一个已知的bug,请参阅[这里](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4486580) – newgre 2009-02-05 17:53:55

2

似乎有很多人遇到这个问题。虽然,Java项目的人显然不认为这是一个优先事项(原始票据大约在10年前开放)。

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

围绕此问题打开的最新错误是6798985.它似乎已经大部分未被注意到。