Заснемане на натискане на клавиш от отделен процес в Java

Искам това да се случи:

  1. Стартирайте моята java програма
  2. Моята java програма стартира notepad.exe
  3. Ако напиша буква в бележника, моята Java програма трябва да реагира и да отпечата буквата

Накратко: Възможно ли е да се направи слушател на ключови събития за друг процес? Java програмата няма да има фокус.

Ако е невъзможно, искам да мога да променя фокуса между моя прозорец на Java swing и процеса на бележника. Например:

A) Моята java програма има фокус (малък люлеещ се прозорец), аз въвеждам буквата „A“
B) Notepad получава бързо фокус и буквата 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'd, може би източникът на проекта все още е активен: 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
Vipar: Вие сте vipar и мога да проследя какво точно сте правили в 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 Keyboard Hook в Windows

Има код за копиране/поставяне, който демонстрира кука за JNA ключ. Ще трябва да изтеглите JNA зависимостите от http://jna.java.net/ за примера за работа. Дори няма да е необходимо да се занимавате с глупави DLL файлове.

Освен това може да искате да опитате тази библиотека. Въпреки че нямам опит с него, той изскочи при търсенето ми в Google за „java keyboard hook“. Изглежда, че постига целта за прихващане на натисканията на клавишите:

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

Имайте предвид, че ще ви е необходим допълнителен собствен код, за да видите какъв е текущият „активен прозорец“. Ако активният прозорец съвпада с "Notepad.exe", тогава трябва да запишете събитие с естествен ключ.

Късмет!

person Alex Lynch    schedule 20.05.2012