Détecter l’événement de déconnexion de Windows dans une application Java

Existe-t-il une bibliothèque que je peux utiliser avec Java pour écouter la déconnexion de l’utilisateur et éventuellement d’autres événements Windows? (Encore mieux si elle supporte plusieurs plates-formes!)

Je me souviens d’avoir lu une bibliothèque de ce type il y a quelques années, mais je n’arrive pas à la trouver maintenant. J’ai vu d’autres threads faire essentiellement la même chose en utilisant Python avec win32ts.

Aussi mieux si c’est gratuit et / ou open source.

Merci.

Remarque : La solution candidate à l’utilisation de Runtime.getRuntime().addShutdownHook(Thread) ne fonctionne pas correctement avec javaw . Je suis toujours à la recherche d’une solution qui fonctionne avec javaw. Voir les identifiants de bogue Java 4486580 et 4302814 . Merci –cam

Je pense que vous voulez regarder Runtime.addShutdownHook () . Cela vous donne la dernière chance de faire les choses avant que la JVM ne s’arrête. Cela vous permet de détecter une déconnexion réelle où toutes les applications sont arrêtées, mais elles ne changent pas temporairement les utilisateurs, laissant leur état prêt à revenir. Toutefois, en guise d’avertissement, tout ce que vous prévoyez de faire pendant le processus d’arrêt doit être bref, car le système d’exploitation peut SIGKILL (ou l’équivalent) sur vous à tout moment, ce qui interrompt immédiatement la JVM.

Si ce n’est pas ce dont vous avez besoin, vous devrez probablement utiliser JNI pour enregistrer un auditeur natif. Comme pour les autres événements Windows, la bibliothèque AWT fournit un certain nombre de classes pour implémenter les écouteurs qui intéresseraient la plupart des applications normales. Dans ce cas, vous pourriez être intéressé par FocusEvent .

Ma meilleure conjecture serait d’utiliser un ShutdownHook . Vous pouvez enregistrer un thread qui est appelé dès que la machine virtuelle Java est arrêtée.

Modifier:
Si vous souhaitez réaliser cela sous Windows, vous pouvez créer une fenêtre invisible et réagir au message WM_QUERYENDSESSION envoyé par le système d’exploitation lors de la fermeture de session ou de l’arrêt du système.

Il semble y avoir beaucoup de gens qui se heurtent à ce problème. Bien sûr, les personnes travaillant sur le projet Java ne considèrent pas cela comme une priorité (le ticket original a été ouvert il y a près de 10 ans).

J’ai eu un certain succès avec le work-around posté dans le bug 4486580 qui utilise le JWindow caché. Cependant, cette solution est considérée comme peu fiable. J’ai également trouvé cette petite discussion lancée par cowwoc qui a publié le document de travail: http://forums.java.net/jive/thread.jspa?threadID=46716 . Ce contournement est mieux que rien, mais il serait bon de bloquer une déconnexion Windows jusqu’à ce que le programme ait définitivement terminé le nettoyage. Vous ne voulez pas faire partie du processus lorsque le processus est terminé.

Le plus récent bogue ouvert à propos de ce problème est le 6798985. Il semble être passé presque inaperçu.