Blog. Just Blog

Определение времени бездействия системы

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда приложениям требуется узнать время бездействия системы, то есть интервал времени, прошедший с момента когда пользователь последний раз пошевелил мышкой или нажал какую-нибудь кнопку на клавиатуре. Для определения время бездействия системы в системах Windows 2000 и старше используется функция API GetLastInputInfo. Она возвращает количество миллисекунд (тиков таймера), прошедшее от старта системы до момента последнего ввода. Время бездействия вычисляется как арифметическая разница между данными, возвращаемыми функцией GetTickCount и данными из GetLastInputInfo. В FASM, как обычно, ничего из нужных структур не определено, лезем в MSDN:
  1. section '.data' data readable writeable
  2.  
  3. struct  LASTINPUTINFO
  4.         cbSize   dd ?   ; Размер структуры
  5.         dwTime   dd ?   ; Время бездействия
  6. ends
  7.  
  8. lii     LASTINPUTINFO  
Получение времени бездействия системы:
  1.         ...
  2.         ; Получить время последнего ввода
  3.         mov     [lii.cbSize],sizeof.LASTINPUTINFO
  4.         invoke  GetLastInputInfo,lii
  5.  
  6.         ; Получить текущее время в миллисекундах
  7.         invoke  GetTickCount
  8.  
  9.         ; EAX - время бездействия системы в миллисекундах
  10.         sub     eax,[lii.dwTime]
  11.         ...
Это был самый простой способ, работающий на всех новых системах. В старых операционках типа Windows 9x функция GetLastInputInfo отсутствует, поэтому там придется использовать другой, более громоздкий способ с применением глобальных системных хуков.

Чтобы перехват получился глобальным, придется загружать в память DLL с нужными функциями и устанавливать хуки уже на нее. Хуки будем ставить двух типов: через WH_MOUSE на мышь и через WH_KEYBOARD на клавиатуру. При наступлении любого из этих событий в переменную, находящуюся в shared-памяти DLL, будет записываться значение из функции GetTickCount, а при вызове какой-нибудь заранее определенной функции, это значение будет передаваться нашему приложению. Полный текст DLL я тут приводить не буду, можете посмотреть его, скачав прилагаемый файл с исходниками. В основное приложение DLL подгружается через импорт, при инициализации DLL ставятся глобальные хуки, а при выходе из приложения хуки должны обязательно сниматься.
  1.         ...
  2.         ; Получить время последнего ввода
  3.         invoke  GetLastInputTime
  4.         mov     ebx,eax
  5.  
  6.         ; Получить текущее время в миллисекундах
  7.         invoke  GetTickCount
  8.  
  9.         ; EAX - время бездействия системы в миллисекундах
  10.         sub     eax,ebx
  11.         ...
  12.         ...
  13.         ...
  14. .wmclose:
  15.         ; Снять глобальные хуки
  16.         invoke  UnloadDll
  17.         ...
Этот метод универсальный и работает на всех системах. Но приходится таскать за собой дополнительную DLL, к установке глобальных хуков некоторые "как-бы-антивирусы" и мониторы могут отнестись с подозрением, ну и вдобавок получается много лишнего кода. Выбор оставляю за вами.

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

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

System.Idle.Time.Demo.zip (6,193 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 6918 | Комментариев: 8

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (09.08.2019 в 17:45):
Стандартный виндовый планировщик прекрасно справляется с этой задачей. Триггер задачи на условие "При простое", "Условия" - установить на нужный интервал время бездействия, "Действия" - запуск программы. И не надо ничего городить.
Kylo (09.08.2019 в 17:34):
Уважаемый ManHunter, ознакомился со списком Ваших программ, нашел для себя много интересного. Спасибо за Ваш труд! И возникло у меня к Вам предложение по использованию определения времени бездействия системы в Вашей же программе Delayed Start. Дополнительный параметр командной строки, например -hNNN, который запускал бы приложение на определенную секунду времени бездействия. Сразу расширяются возможности применения Delayed Start. Ну а дальше можно фантазировать еще больше - "ds -h600 -c winamp.exe" - запуск музыки после 10мин бездействия пользователя и закрытие winamp.exe (параметр -c) при активности пользователя. Минус примера, нельзя оставлять громкость наполную уходя далеко от компа))
ManHunter (08.08.2019 в 16:53):
За доработками лучше обратиться куда-нибудь на фриланс. Задача не космическая, за мелкий прайс студенты с радостью нарисуют что угодно, тем более вся теория расписана.
Kylo (08.08.2019 в 16:35):
Мне бы было полезно использовать эту наработку как таймер для запуска каких либо задач. Полдня сегодня просидел в поисках реализации такого "таймера", ничего толкового не нашел. Исходники C++, VB, PS, AutoIt, у уважаемого ManHunter здесь на ASM, но уже готового решения нет. Если бы я в этом понимал, конечно использовал бы эти наработки для создания того, что мне нужно, но увы, мозгами не вышел. А так бы можно было сделать с GUI и без, оснастить дополнительными параметрами, взятием настроек из файлов и реестра. Если у Вас, уважаемый ManHunter, есть возможность, желание и время расширить функционал Вашей наработки, буду очень благодарен!
Tekton (15.10.2015 в 10:13):
Я например частенько вечером "рублюсь" при просмотре какого нибудь фильма.
Просыпаюсь под утро, а комп во всю пашет.
Вот можно применить эту наработку.
Сделать скажем таймер часа на 2 если юзер не пошевелил мыш, или клаву не потискал, чтоб комп отрубался сам.
Vovka (09.08.2010 в 22:15):
Вызов скорой помощи для онлайновых параноиков...
ManHunter (06.08.2010 в 08:01):
Дефрагментация диска при простое компа, автоблокировка оставленного без присмотра компа, мониторинг работы сотрудников. Это так, навскидку.
Isaev (06.08.2010 в 01:55):
"Определение времени бездействия системы"
А в каких случаях эта информация используется?
Что-то так и не придумал ничего полезного (

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0044 сек.) / Память: 5 Mb
Наверх