2009-02-04 11 views
2

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 prend en charge plusieurs plates-formes!)Détecter l'événement de déconnexion Windows dans l'application Java

Je me souviens avoir lu sur une bibliothèque de ce genre il y a un certain nombre d'années, mais je n'arrive pas à le 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 candidat de l'utilisation Runtime.getRuntime().addShutdownHook(Thread) ne fonctionne pas correctement avec javaw. Je suis toujours à la recherche d'une solution qui fonctionnera avec javaw. Voir les ID de bogue Java 4486580 et 4302814. Merci --cam

Répondre

7

Je pense que vous voulez regarder Runtime.addShutdownHook(). Cela vous donne l'occasion ultime de faire les choses avant que la JVM ne s'éteigne. Cela vous permet de détecter une déconnexion réelle où toutes les applications sont arrêtées, mais pas seulement de changer temporairement d'utilisateur, laissant son état prêt à revenir. Cependant, à titre d'avertissement, tout ce que vous prévoyez de faire pendant le processus d'arrêt doit être bref puisque le système d'exploitation peut vous SIGKILL (ou l'équivalent) à 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 écouteur 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 un FocusEvent.

+0

Malheureusement, cela ne fonctionne pas lorsque vous utilisez javaw. –

3

Ma meilleure estimation serait d'utiliser un ShutdownHook. Vous pouvez enregistrer un thread qui est appelé dès que la JVM est en cours d'arrêt.

Edit:
Si vous voulez réaliser ce sous Windows, vous pouvez créer une fenêtre invisible et réagir sur le message WM_QUERYENDSESSION qui est envoyé par le système d'exploitation lors de l'utilisateur se déconnecter ou l'arrêt du système.

+0

Malheureusement, l'utilisation d'un hook d'arrêt dans Runtime ne fonctionne pas avec javaw. –

+1

Il semble être un bug connu, voir [ici] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4486580) – newgre

2

Il semble y avoir beaucoup de gens qui rencontrent ce problème. Bien que les gens sur le projet Java ne considèrent évidemment pas cela comme une priorité (le ticket original a été ouvert il y a près de 10 ans).

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

Le plus récent bug ouvert autour de ce problème est le 6798985. Il semble qu'il soit passé presque inaperçu.

+1

Le lien fourni est mort! – Peacelyk

Questions connexes