Отслеживание событий окна уровня ОС в Java

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

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам