2

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

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

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

谢谢。

注意: using 的候选解决方案Runtime.getRuntime().addShutdownHook(Thread)不能与javaw. 我仍在寻找适用于 javaw 的解决方案。请参阅 java 错误 ID 44865804302814。谢谢--cam

4

3 回答 3

7

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

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

于 2009-02-04T18:28:50.823 回答
3

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

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

于 2009-02-04T18:21:27.127 回答
2

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

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

围绕此问题最近打开的错误是 6798985。它似乎几乎没有被注意到。

于 2009-12-11T21:23:09.107 回答