В некоторых случаях требуется, чтобы на время работы вашего приложения компьютер постоянно оставался в активном состоянии, то есть не включался скринсейвер, не отключался монитор, система не переходила в спящий режим. Для этого надо "убедить" Windows, что за клавиатурой сидит реальный пользователь и проявляет какую-то активность, в этом случае все счетчики времени бездействия будут сбрасываться. Для программной имитации действий пользователя используются две функции:
mouse_event для симуляции работы с мышкой мышки и, соответственно,
keybd_event для клавиатуры. Также можно использовать более универсальную функцию
SendInput, она позволяет симулировать не только мышку и клавиатуру, но и хардварные события. Есть еще более суровые варианты, связанные с ковырянием в реестре, изменением профилей электропитания, но их я рассматривать не буду.
В прикладном приложении для имитации действий пользователя надо установить таймер, например, на секундный интервал, и в его функции-обработчике симулировать движение мыши. Нажатия кнопок мыши и клавиш на клавиатуре симулировать не надо, так как эти действия могут наложиться с действиями реального пользователя, а вот перемещение мышки на какое-нибудь незаметное расстояние будет в самый раз. Почитаем повнимательнее документацию к функции mouse_event. Координаты перемещения задаются в условных единицах - микки, которые высчитываются по формуле: 1 микки = (ширина или высота разрешения монитора) / 65535. Если не указан флаг MOUSEEVENTF_ABSOLUTE, то координаты считаются относительные, то есть от текущего положения курсора. Первоначальный вариант решения был в перемещении курсора на 1 микки от текущего положения курсора, а затем в возвращении его обратно. Но, к сожалению, на Windows XP этот способ все-таки двигал курсор (спасибо ezfalc0n за подсказку). Следующий вариант, вообще без движения, также сбрасывает счетчик времени бездействия системы, так что будем использовать именно его:
; Симулировать событие от мышки, оставляя ее на месте
invoke mouse_event,MOUSEEVENTF_MOVE,0,0,0,0
Вот и все решение. Теперь Windows будет бодрствовать ровно столько, сколько вам нужно. Вы увидите, что даже когда вы сами не прикасаетесь к мышке и клавиатуре, таймер бездействия системы (функция GetLastInputInfo) остается на нулевой отметке.
В приложении пример программы, симулирующей работу пользователя за компьютером. Каждую секунду имитируется движение курсора мышки.