Обнаружение события выхода из системы Windows в приложении Java - PullRequest
2 голосов
/ 04 февраля 2009

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

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

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

Спасибо.

Примечание : Возможный вариант использования Runtime.getRuntime().addShutdownHook(Thread) не работает правильно с javaw. Я все еще ищу решение, которое будет работать с javaw. См. Идентификаторы ошибок Java 4486580 и 4302814 . Спасибо --cam

Ответы [ 3 ]

7 голосов
/ 04 февраля 2009

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

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

3 голосов
/ 04 февраля 2009

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

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

2 голосов
/ 12 декабря 2009

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

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

Самая последняя обнаруженная ошибка, связанная с этой проблемой, - 6798985. Похоже, что она в основном осталась незамеченной.

...