ventana - Detectar el evento de cierre de sesión de Windows en la aplicación Java
evitar cerrar ventana javascript (3)
¿Hay alguna biblioteca que pueda usar con Java para escuchar el cierre de sesión del usuario y posiblemente otros eventos de Windows? (¡Aún mejor si es compatible con múltiples plataformas!)
Recuerdo haber leído acerca de una biblioteca de este tipo hace varios años, pero parece que no puedo encontrarla ahora. He visto otros hilos para hacer esencialmente lo mismo usando Python con win32ts.
También mejor si es gratis y / o de código abierto.
Gracias.
Nota : La solución candidata de usar Runtime.getRuntime().addShutdownHook(Thread)
no funciona correctamente con javaw
. Todavía estoy buscando una solución que funcione con javaw. Consulte los id . De bug java 4486580 y 4302814 . Gracias --cam
Creo que quieres ver Runtime.addShutdownHook () . Esto le brinda la última oportunidad de hacer cosas antes de que la JVM se apague. Esto le permite detectar un cierre de sesión real donde todas las aplicaciones están apagadas, pero no solo cambian temporalmente de usuario, dejando su estado listo para volver. Sin embargo, como advertencia, lo que planee hacer durante el proceso de cierre debe ser breve, ya que el sistema operativo puede hacer SIGKILL (o su equivalente) en cualquier momento, lo que detiene la JVM inmediatamente.
Si esto no es lo que necesita, probablemente necesite usar JNI para registrar un oyente nativo. En cuanto a los otros eventos de Windows, la biblioteca AWT proporciona una serie de clases para implementar los oyentes que interesarían a la mayoría de las aplicaciones normales. En este caso, podría interesarle un FocusEvent .
Mi mejor opción sería usar un ShutdownHook . Puede registrar un hilo que se invoca tan pronto como se cierre la JVM.
Editar:
Si desea realizar esto en Windows, puede crear una ventana invisible y reaccionar en el mensaje WM_QUERYENDSESSION que envía el SO cuando el usuario cierra la sesión o se apaga el sistema.
Parece que hay mucha gente que se está metiendo en este tema. Aunque, las personas en el proyecto Java, obviamente, no lo consideran una prioridad (el boleto original se abrió hace casi 10 años).
He tenido cierto éxito con la solución de problemas publicada en el error 4486580 que utiliza la ventana oculta JWindow. Sin embargo, este trabajo alternativo se considera poco confiable. También encontré esta pequeña discusión iniciada por cowwoc que publicó la solución alternativa: http://forums.java.net/jive/thread.jspa?threadID=46716 . Este work-around es mejor que nada, pero sería bueno bloquear un cierre de sesión de Windows hasta que el programa haya terminado definitivamente la limpieza. No desea ser parte del proceso cuando finaliza el proceso.
El error más reciente que se abrió en torno a este problema es 6798985. Parece que pasó casi desapercibido.