繁体   English   中英

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

[英]Detect windows logout event in Java application

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

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

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

谢谢。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM