Как отслеживать активность пользователей в масштабе всей системы? - PullRequest
2 голосов
/ 22 августа 2011

Как реализовать некий фоновый процесс, который постоянно (или через короткие промежутки времени) проверяет, взаимодействует ли пользователь с системой, то есть просто и просто, используя компьютер? Очевидным способом является проверка пользовательских событий любого рода, таких как нажатия клавиш, движения мыши и щелчки мыши и так далее. Записывать события в определенном приложении просто, потому что они обычно автоматически передаются через цикл событий приложения, но как достичь этого в масштабе всей системы, т. Е. Независимо от того, какое приложение находится впереди / имеет фокус? Как это сделать элегантно, чтобы такой процесс не потреблял слишком много системных ресурсов?

Меня это вообще интересует, но очевидно, что для каждой платформы есть разные пути - кроссплатформенный способ (Java) был бы идеальным, но моей платформой выбора является Mac OS X (Cocoa).

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Идея Томаса Лэнгстона, чтобы проверить, как pidgin (libpurple) делает это, была очень полезна.Я скачал исходный код и нашел это -

В pidgin-2.10.0 / pidgin / gtkidle.c, начиная со строки 46:

/*
* Get the number of seconds the user has been idle.  In Unix-world
* this is based on the X Windows usage.  In MS Windows this is
* based on keyboard/mouse usage information obtained from the OS.
* In MacOS X, this is based on keyboard/mouse usage information
* obtained from the OS, if configure detected IOKit.  Otherwise,
* MacOS X is handled as a case of X Windows.
*
* In Debian bug #271639, jwz says:
*
* Purple should simply ask xscreensaver how long the user has been idle:
*   % xscreensaver-command -time
*   XScreenSaver 4.18: screen blanked since Tue Sep 14 14:10:45 2004
*
* Or you can monitor the _SCREENSAVER_STATUS property on root window #0.
* Element 0 is the status (0, BLANK, LOCK), element 1 is the time_t since
* the last state change, and subsequent elements are which hack is running
* on the various screens:
*   % xprop -f _SCREENSAVER_STATUS 32ac -root _SCREENSAVER_STATUS
*   _SCREENSAVER_STATUS(INTEGER) = BLANK, 1095196626, 10, 237
*
* See watch() in xscreensaver/driver/xscreensaver-command.c.
*
* @return The number of seconds the user has been idle.
*/

Этот файл содержит код для обработки этогодля разных платформ.

1 голос
/ 22 августа 2011

Захват системного события, такого как нажатие клавиши или движение мыши, не относится ни к одному языку как таковому. Это в основном то, чем управляет ОС, и поскольку вам нужен какой-то механизм, который должен прослушивать общесистемные события, вы должны так или иначе зависеть от API, предоставляемого ОС. Например, в Windows вы получаете Win API, который можно использовать из Java-программы для прослушивания общесистемных событий. Но это будет характерно для Win API, поэтому для Mac OS это будет другая версия API.

1 голос
/ 22 августа 2011

Я не знаю четкого ответа, но я знаю, куда я пойду, чтобы посмотреть.Pidgin и другие IM-клиенты с открытым исходным кодом должны знать, не занят ли пользователь.Я уверен, что вы можете использовать аналогичный метод для определения активности пользователя.

...