Blog. Just Blog

Как запретить Windows переходить в спящий режим

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В некоторых случаях требуется, чтобы на время работы вашего приложения компьютер постоянно оставался в активном состоянии, то есть не включался скринсейвер, не отключался монитор, система не переходила в спящий режим. Для этого надо "убедить" Windows, что за клавиатурой сидит реальный пользователь и проявляет какую-то активность, в этом случае все счетчики времени бездействия будут сбрасываться. Для программной имитации действий пользователя используются две функции: mouse_event для симуляции работы с мышкой мышки и, соответственно, keybd_event для клавиатуры. Также можно использовать более универсальную функцию SendInput, она позволяет симулировать не только мышку и клавиатуру, но и хардварные события. Есть еще более суровые варианты, связанные с ковырянием в реестре, изменением профилей электропитания, но их я рассматривать не буду.

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

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

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

Preventing.Windows.to.Sleeping.Demo.zip (2,012 bytes)


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

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

Комментарии

Отзывы посетителей сайта о статье
Sem (07.08.2012 в 20:04):
Спасибо очень помогло.
Nashev (10.01.2012 в 19:59):
Вот интересно, каким таким официально кошерным способом эту проблему решают видеоплееры и телетюнеры?... И ведь успешно решают!
Виктор (14.04.2011 в 15:19):
То, что мне нужно. А то удалённый рабочий стол запарил отключаться. СПАСИБО
ManHunter (13.02.2011 в 02:26):
Браузером.
фыва (12.02.2011 в 23:25):
Файл не качается
zummenix (01.12.2010 в 19:52):
Добавить не проблема. Только бездумно не копируй, разберись.
; ...
cmp     [wmsg],WM_CREATE
je      .wm_create
cmp     [wmsg],WM_TIMER
je      .wm_timer
; ...
.wm_create:
; ...
invoke  SetTimer,[hwnd],1,60000,0
xor     eax,eax
jmp     .finish
; ...
.wm_timer:

invoke  mouse_event,MOUSEEVENTF_MOVE,0,0,0,0
xor     eax,eax
jmp     .finish
Вадим (01.12.2010 в 18:29):
zummenix, в исходнике tray.asm нет WM_TIMER
zummenix (29.11.2010 в 17:55):
Вадим, в исходнике tray.asm в оработчик WM_CREATE достаточно добавить функцию SetTimer, а в обработчик WM_TIMER добавить функцию mouse_event.
Вадим (29.11.2010 в 01:43):
Манипуляции с функциями и обработчиками не помогли, не знаю верно или нет добавив всё без них. Получилось так:

proc MainWindowProc hWnd,uMsg,wparam,lparam
local pt:POINT
; начало_добавлено
        invoke  SetTimer,[hWnd],1,1000,NULL             ; уст. таймер
        invoke  mouse_event,MOUSEEVENTF_MOVE,0,0,0,0    ; эмуляция мыши
; конец_добавлено
        push    ebx esi edi
        mov     eax,[uMsg]
        cmp     eax,WM_SHELLNOTIFY
        je      .wmshellnotify
        cmp     eax,WM_COMMAND
... ...
zummenix (28.11.2010 в 16:49):
Вадим, функцию SetTimer перенеси в обработчик WM_CREATE, а обработчик WM_INITDIALOG можно удалить.
Вадим (27.11.2010 в 13:14):
Не добавляются комментарии

Пытаюсь добавить в SysTray (http://flatassembler.net/examples/tray.zip) функции из noSleeping, не выходит.

Пробовал полностью процесс "DialogProc" из "noSleeping" добавлять.
Пробовал в процесс "SysTray", под названием "MainWindowProc" добавлять таймер и эмуляцию.

Тут то до чего я дошёл - deposit files . com / files / b4sa7wdlz
Пожалуйста, помогите разобраться.

П.С. В ссылке на депозит добавлял пробелы, т.к. хитрая фильтрация сообщения не пропускала
zummenix (25.11.2010 в 20:34):
Кстати, в исходнике секцию данных можно убрать ;)
ManHunter (23.11.2010 в 08:45):
"Вот оно чо, Михалыч...." (С)
А я-то думал, что самый простой способ - это зайти в настройки электропитания и установить все "Отключать через" на значение "Никогда".
hello (23.11.2010 в 08:04):
А можно ещё проще - запустить uTorrent, можно даже и пустой, в настройках оного есть опция о запрете вхождения компьютера в спящий режим.
ezfalc0n (16.11.2010 в 01:23):
все работает замечательно
ManHunter (28.10.2010 в 10:14):
В любом гуглояндексе сотни примеров работы с иконкой в трее, в том числе и на Ассемблере. Отличный пример иконки с менюшкой в трее есть на офсайте FASM в разделе "Исходники".
Вадим (28.10.2010 в 09:18):
Спасибо за утилиту!
Было б счастье дополнить демо-примеры возможностью свернуть окошко в трей.
Спасибо!
ManHunter (26.10.2010 в 08:14):
При значениях 2 и -1 на Win7 курсор ползет вправо. Еще раз проверил на WinXP вариант с нулевым смещением, все работает прекрасно. Скринсейвер блокируется, GetLastInputInfo висит по нулям.

Как вариант, наверное, можно будет в обработку по таймеру добавить дополнительную проверку счетчика бездействия системы. Если он более, например, 10 секунд, то сэмулировать нажатие на какую-нибудь клавишу типа Shift.
ezfalc0n (26.10.2010 в 00:38):
В моем случае вариант с 0 смещением не блокирует скринсейвер. Нормально работает вариант со смещением на 2 и сразу на -1. Курсор стоит на месте и скринсейвер не стартует. Почему так происходит - для меня загадка.

В некоторых частных случаях эта методика влияет на работу программ. Например, при полноэкранном воспроизведении видео, панель управления плеера не исчезает.

Спасибо за интересные статьи
suhov8 (26.10.2010 в 00:15):
а есть ли возможность отключить обрабатывание действий на клавиатуре, так чтоб счетчики бездействия не сбрасывались. Давняя мечта) чтоб монитор не просыпался, когда я плеером управляю))
ManHunter (25.10.2010 в 11:15):
Проверил. На WinXP действительно курсор перемещается, так что оставляем вариант с нулевым перемещением. ezfalc0n, спасибо за подсказку! Статью подправил, пример перезалил.
ManHunter (25.10.2010 в 08:44):
Надо будет проверить на других мониторах. А так да, при нулевом значении перемещения мышки GetLastInputInfo тоже сбрасывается и скринсейвер не запускается. Допишу в статье.
ezfalc0n (25.10.2010 в 05:20):
странно, но вызов mouse_event с dx и dy равными 0 и 1 идентичны - движения не происходит
ezfalc0n (25.10.2010 в 05:04):
курсор медленно едет влево

стоит на месте, если в первом вызове 1 заменить на 2:
        invoke  mouse_event,MOUSEEVENTF_MOVE,2,0,0,0
        invoke  mouse_event,MOUSEEVENTF_MOVE,-1,0,0,0
semiono (25.10.2010 в 04:45):
+1
ещё бы в телефоне это запретить, чтоб экран с часами не гас ))

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

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

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