2009-02-04 3 views
2

Есть ли библиотека, которую я могу использовать с Java, чтобы прослушивать выход пользователя из системы и, возможно, другие события Windows? (Еще лучше, если он поддерживает несколько платформ!)Обнаружение события выхода Windows в приложении Java

Я помню, как несколько лет назад я читал об этой библиотеке, но не могу ее найти. Я видел другие потоки, чтобы сделать по существу то же самое, используя Python с win32ts.

Также лучше, если это бесплатно и/или с открытым исходным кодом.

Спасибо.

Примечание: Кандидат решение с использованием Runtime.getRuntime().addShutdownHook(Thread) не правильно работать с javaw. Я все еще ищу решение, которое будет работать с javaw. См. Java bug ids 4486580 и 4302814. Спасибо --cam

ответ

7

Я думаю, вы хотите посмотреть на Runtime.addShutdownHook(). Это дает вам возможность проделать все до того, как JVM отключится. Это позволяет обнаружить фактический выход из системы, где все приложения завершены, но они не просто временно переключают пользователей, оставляя их состояние готовым к возвращению. Однако, как предупреждение, все, что вы планируете делать во время процесса выключения, должно быть кратким, поскольку ОС может в любой момент SIGKILL (или эквивалент), что немедленно останавливает JVM.

Если это не то, что вам нужно, вам, вероятно, понадобится использовать JNI для регистрации собственного слушателя. Что касается других событий Windows, библиотека AWT предоставляет ряд классов для реализации слушателей, которые будут интересовать большинство обычных приложений. В этом случае вас может заинтересовать FocusEvent.

+0

К сожалению, это не работает при использовании javaw. –

3

Мое лучшее предположение было бы использовать ShutdownHook. Вы можете зарегистрировать поток, который вызывается, как только JVM отключится.

Edit:
Если вы хотите, чтобы понять это под окнами, вы можете создать невидимое окно и реагировать на WM_QUERYENDSESSION сообщение, которое отправляется операционной системой на пользователя системы или завершения работы системы.

+0

К сожалению, использование таймера выключения в режиме Runtime не работает при использовании javaw. –

+1

Кажется, что это известная ошибка, см. [Здесь] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4486580) – newgre

2

В этой проблеме, похоже, много людей. Хотя люди на Java-проекте явно не считают этот приоритет приоритетным (первоначальный билет был открыт почти 10 лет назад).

У меня был некоторый успех с обходным сообщением в баг 4486580, в котором используется скрытый JWindow. Однако эта работа считается ненадежной. Я также нашел эту небольшую дискуссию, начатую cowwoc, которая опубликовала обход: http://forums.java.net/jive/thread.jspa?threadID=46716. Эта работа лучше, чем ничего, но было бы неплохо заблокировать выход из системы, пока программа не завершит окончательную очистку. Вы не хотите быть частью процесса, когда процесс завершается.

Самая недавняя ошибка, открытая вокруг этой проблемы, - 6798985. Кажется, она прошла в основном незаметно.

+1

Если ссылка мертва! – Peacelyk

Смежные вопросы