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