Захватить нажатие клавиши из отдельного процесса в Java

Я хочу, чтобы это произошло:

  1. Запустить мою Java-программу
  2. Моя программа java запускает notepad.exe
  3. Если я наберу письмо в блокноте, моя Java-программа должна отреагировать и распечатать письмо.

Вкратце: можно ли сделать прослушиватель ключевых событий для другого процесса? У программы java не будет фокуса.

Если это невозможно, я хочу иметь возможность переключать фокус между моим окном Java Swing и процессом блокнота. Например:

A) Моя java-программа имеет фокус (маленькое окно поворота), я набираю букву «A»
B) Блокнот быстро получает фокус и там набирается буква A (например, с использованием класса Robot)
C) Моя программа Java снова в фокусе


Цитата из ответа, приведенного в Создание клавиатуры для программы Java, которая находится в системном трее

Итак, создать крючок клавиатуры не так просто, как кажется, java не предоставляет прямого способа взаимодействия с системными событиями в целях безопасности; так как это может привести к серьезным проблемам, связанным с JVM, системной памятью и переносимостью Java Framework.

у вас есть 4 способа сделать глобальные перехватчики клавиатуры:

  1. Изучите JNI / JNA, и я предпочитаю JNA, поскольку он намного проще, чем JNI, в обоих случаях вы будете иметь дело с файлами .dll.
  2. Используйте JIntellitype, который, как вы сказали, вызывает некоторые проблемы.
  3. элегантное решение Сергея Билетникова здесь http://biletnikov-dev.blogspot.com/2009/09/global-hotkeys-for-java-applications_25.html
  4. игнорируйте Java и попробуйте Autoit V3 (я не уверен на 100%, но я думаю, что вы можете отправлять сигналы / события из Autoit в свое приложение Java, поэтому Autoit будет просто работать как мост, который улавливает нажатия глобальных клавиш)

Выбираю номер 3, который является хорошим учебным пособием. Если по ссылке 404, возможно, исходный код проекта все еще открыт: gigapeta.com/dl/1917618aba749a


person user1405714    schedule 20.05.2012    source источник
comment
Также: должно работать только в Windows. Если мне нужно сделать что-то родное, скажите, пожалуйста, как   -  person user1405714    schedule 20.05.2012
comment
Но вы все равно можете быть анонимным, знаете ли ... Я, например, сейчас аноним. Вы не имеете абсолютно никакого представления о том, кто я.   -  person OmniOwl    schedule 20.05.2012
comment
То, что вы пытаетесь сделать, противоречит модели безопасности Java. Это невозможно.   -  person Jivings    schedule 20.05.2012
comment
Випар: Вы випар, и я могу точно отслеживать, что вы делали в stackoverflow. Вы, кажется, не понимаете, что такое анонимность. Я не знаю, кто вы, IRL, но у вас есть личность.   -  person user1405714    schedule 20.05.2012
comment
Jivings: Есть способы обойти это, даже если мне придется использовать некоторый код JNI (который я никогда раньше не использовал). Кто-то в этом мире знает как, мне просто нужно, чтобы мне повезло, и я до него добрался.   -  person user1405714    schedule 20.05.2012
comment
Взгляните здесь   -  person Jeffrey    schedule 20.05.2012
comment
Возможно, более серьезный вопрос заключается в том, почему вы хотите это сделать? В целом, чего вы пытаетесь достичь?   -  person Bohemian♦    schedule 20.05.2012
comment
Джеффри: Спасибо, именно то, что мне нужно! Bohemian: Нет, самый большой вопрос не в том, почему. Это не имеет значения. Вы, наверное, думаете, что я хочу сделать прослушиватель паролей или что-то в этом роде. Но я вам скажу, я хочу сделать возможным управление вашим персонажем в Diablo 3 с помощью клавиатуры вместо мыши. Просто кое-что, о чем я подумал и подумал, что было бы весело сделать. В конце концов, мне нравится программировать больше, чем играть в игры.   -  person user1405714    schedule 20.05.2012
comment
Тогда вы должны указать это в своем вопросе. Может быть, есть другое, зачем это делать. Вы спросили о конкретной реализации, когда другая может быть лучше. Такая небольшая информация может помочь другим дать более точные ответы.   -  person Bohemian♦    schedule 20.05.2012
comment
Я был бы очень-очень удивлен, если бы существовал какой-нибудь способ сделать это.   -  person Louis Wasserman    schedule 20.05.2012


Ответы (1)


С вашим представленным решением # 1:

Изучите JNI / JNA, и я предпочитаю JNA, поскольку он намного проще, чем JNI, в обоих случаях вы будете иметь дело с файлами .dll.

Вам следует взглянуть на этот поток stackoverflow:

Перехват клавиатуры JNA в Windows

Существует код копирования / вставки, демонстрирующий перехват ключа JNA. Вам нужно будет загрузить зависимости JNA с http://jna.java.net/ для примера, чтобы Работа. Вам даже не придется возиться с глупыми DLL.

Кроме того, вы можете попробовать эту библиотеку. Хотя у меня нет опыта с этим, он всплыл в моем поиске Google по запросу "крючок для клавиатуры java". Вроде выполнили задачу по перехвату нажатий клавиш:

http://code.google.com/p/jnativehook/

Обратите внимание, что вам понадобится дополнительный машинный код, чтобы увидеть, что такое текущее «активное окно». Если активное окно соответствует «Notepad.exe», вам следует записать собственное ключевое событие.

Удачи!

person Alex Lynch    schedule 20.05.2012