Отслеживание событий окна уровня ОС в Java - PullRequest
2 голосов
/ 03 марта 2009

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

У нас в этом приложении есть еще кое-что, что было бы просто в Java. Однако я не занимался программированием GUI на Java, поэтому не уверен, что можно получить информацию об окнах уровня ОС через API AWT. Это вообще возможно? Будет ли другой способ сделать это через JNI или для этого потребуется собственное приложение?

PS: я знаю, что это требование звучит немного гнусно, но я здесь только для того, чтобы определить, технически это возможно или нет. Пожалуйста, не стреляйте в курьера, это была не моя идея. :)

Ответы [ 8 ]

5 голосов
/ 03 марта 2009

Фокус события могут работать; Вы также можете рассмотреть возможность подключения клавиатуры и мыши Windows . При любом из этих подходов вы захотите создать DLL (нативный код) и использовать JNI для доступа к ней.

5 голосов
/ 03 марта 2009

Не прибегая к нативному коду, я не думаю, что это будет возможно.

1 голос
/ 03 марта 2009

Вы можете искать библиотеку оконного тестирования - некоторые из них предназначены для создания и перехвата собственных событий win32.

0 голосов
/ 05 сентября 2011

мы также можем отслеживать список задач Windows, чтобы отслеживать приложение, используемое пользователем, и его просто в java для чтения консоли, и вы также можете получить данные процесса из него, но вам потребуется небольшая тяжелая обработка строки в нем, bcz все данные, которые вы получите, будут в строковом формате, и вы должны будете получать от них необходимые данные, чтобы сделать их полезными; если вам потребуется дополнительная помощь, я могу дать код для этого, чтобы отслеживать и сохранять эти данные для трассировки, но это решение не будет переопределять событие окна, оно даст информацию о задаче,

0 голосов
/ 03 марта 2009

Если вы хотите сделать это из Java и не хотите писать свой собственный нативный код, вы можете попробовать SWT . Я сомневаюсь, что у него есть независимые от платформы способы выполнения того, что вы хотите, но вы можете покопаться в классах, специфичных для Windows, особенно org.eclipse.swt.internal.win32.OS.

0 голосов
/ 03 марта 2009

Вы в основном просите, чтобы ваше приложение было включено в уведомления ОС для других приложений. Вероятно, вам понадобится либо приложение, которое запускает другие приложения в качестве дочерних процессов, либо использование чего-то вроде руткит-API для установки разрешений, превышающих то, что предоставляется нормальному приложению.

Если цель состоит в том, чтобы увидеть, сколько времени пользователь взаимодействует с вашим приложением, вы можете получить некоторые грубые идеи, посмотрев на то, какое время ЦП запланировано для вашего приложения или как посмотреть на задержки между событиями ввода-вывода и отображением в статистику о том, насколько активен пользователь.

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

0 голосов
/ 03 марта 2009

Я думаю, вам стоит подумать об использовании другого языка.
Есть другие языки, такие как C ++, например, которые предопределены для такого рода проблем:)

0 голосов
/ 03 марта 2009

Я не думаю, что это возможно с помощью AWT. У Java нет возможности доступа к процессам для других приложений.

...