Слушатель событий на Java без приложения, имеющего фокус? (Глобальное обнаружение нажатия клавиш) - PullRequest
18 голосов
/ 29 апреля 2009

Я долго искал, и все, кажется, думают, что это невозможно с использованием только Java, поэтому я попробую ТАК;)

Есть ли способ заставить мое Java-приложение прослушивать события (в частности, ключевые события), в то время как другое не связанное приложение имеет фокусировку на окне? В моей ситуации я пытаюсь определить, когда пользователь нажал клавишу «Пауза» на клавиатуре, даже если у моего Java-приложения нет фокуса.

Я слышал, что некоторые люди упоминают, что единственный способ - написать код на C и использовать JNI. Просто любопытно, если кто-нибудь знает способ избежать этого? Или, если нет, по крайней мере, действительно хороший учебник по материалам c / JNI?

Спасибо

Ответы [ 3 ]

14 голосов
/ 30 мая 2011

Вот лучший ответ, который я нашел:

» Существует библиотека для управления встроенной клавиатурой и мышью: https://github.com/kwhat/jnativehook) «

11 голосов
/ 29 апреля 2009

Насколько я понимаю, это невозможно. На фундаментальном уровне JVM генерирует события только для событий O / S, которые она получает, и она получает только события ввода O / S, когда она имеет фокус.

Я уверен, что вы могли бы использовать JNI для запуска O / S, чтобы генерировать события для всех входных данных, но это будет зависеть от O / S.

2 голосов
/ 29 апреля 2009

Я тоже не знаю, как обойти это. Я нашел эту ссылку на форумах Java с хорошим примером того, как настроить JNI и создать глобальный обработчик клавиатуры (слишком много, чтобы добавить сюда). Он немного устарел (2005), но пример выглядит достаточно основательно, чтобы вы могли начать.

...