MCP

воскресенье, 18 сентября 2011 г.

Определяем бездействие пользователя в Windows

Сегодня я распишу несколько WinAPI функций для определения того, что пользователя сейчас нет на месте и можно принять соответствующие меры. Какие меры можно принять?

  • Если нужен ответ от пользователя на не очень важный вопрос, можно принять решение самостоятельно или же продолжить заниматься другими вещами, отложив вопрос до появления
  • Если идут вычисления, можно поднять приоритет операции
  • Если идёт демонстрация некой информации, её можно остановить, чтобы зря не переводить ресурсы
  • Если есть подобие мессенжера, можно изменить статус
Итак, как это можо сделать:

GetLastInputInfo

Данная функция возвращает время последнего действия пользователя мышкой или клавиатурой. Т.е. если пользователь ничего не делает с компьютером, наверное его уже и нет за ним (как вариант — он медитирует перед компьютером). Оцениваем необходимое время, которое будет являться символом бездействия, например 10 минут (с помощью GetSystemTime), и делаем своё грязное дело. 

SPI_GETSCREENSAVERRUNNING

Это параметр функции SystemParametersInfo, по названию понятно, что можно определить, запущен ли в данный момент скринсейвер. Если запущен, то очевидно, что пользователь не увидит нашу программу, и можно принимать решения самостоятельно

SC_MONITORPOWER

Это глобальное сообщение, рассылаемое системной или приложением, через WM_SYSCOMMAND, сигнализирующее о том, что монитор включен/спит/выключен. Можно считать более продвинутым вариантом скринсейвера (ну и вручную отключать монитор, но это не тема этого поста).

WTS_SESSION_LOCK/WTS_SESSION_UNLOCK

Данные события помогут нам определить момент блокировки компьютера пользователем. К сожалению, текущее состояние блокировки, таким образом определить не получится, но по умолчанию можно считать, что раз кто-то запустил вашу программу, то система явно не блокирована. Блокировка — это событие явственно свидетельствующее о том, что пользователь убежал от компьютера, правда используется в основном в организациях в целях безопасности, дома мало кто это делает. Но, тем не менее событие очень хорошее, поэтому грех им не воспользоваться.
Для этого регистрируемся на получение события через WTSRegisterSessionNotification и в WndProc (основной функции, обработчике всех событий) ловим сообщение WM_WTSSESSION_CHANGE. Естественно, у нас должно быть некоторое окно, которое будет это обрабатывать. Если приложение не подразумевает наличие окон, можно создать невидимое.