
После нескольких месяцев бездействия я хотел бы вернуться к идее, которая кажется невероятно простой. Я хочу иметь скрипт, который будет будить мои мониторы после того, как они были отправлены в спящий режим. Я перепробовал почти все подходы, которые только мог придумать, пожалуйста, кто-нибудь, спасите меня от усыновления собаки, которая приносит мышь Bluetooth в форме косточки, шевеля ею в процессе (да, я в таком отчаянии)
Что я уже сделал:
1) Установка OpenSSH на удаленной машине Win10 (работает)
2)Получающийинтерактивный сеанс Windows, чтобы иметь полномочия над реальным сеансом:
FOR /F "usebackq tokens=4" %s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO ...
3а) Запуск одного измногоПрограммы поддержания активности Windows. Они не работают, потому что никогда не запускаются psexec или powershell. Или, по крайней мере, если они запускаются, то не отображаются и ничего не делают. Это касается любого процесса, который я пытаюсь запустить.
3б) Используйте SendMessage
то же, что и я, для перевода в спящий режим:
psexec -accepteula -nobanner -d -i %%s -w "%windir%" powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,-1)
Передача 2 в качестве последнего параметра отлично подходит для выключения монитора. Передача чего-либо другого (например, -1 для ВКЛ) ничего не делает.
3c) Теперь я в отчаянии пытаюсь сделатьимитация покачивание мыши/нажатия клавиши т. д.:
FOR /F "usebackq tokens=4" %%s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO psexec -accepteula -nobanner -d -i %%s -w "%windir%" powershell (Add-Type '[DllImport(\"user32.dll\")]^public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);' -Name user32 -PassThru)::mouse_event(1,40,0,0,0)
Работает локально с повышенными правами. Выводит всплывающее окно PowerShell на короткое время при использовании с SSH. Не делает никаких движений мышкой.
3d) используя старый добрый nircmd.exe monitor off или аналогичные специальные утилиты turn monitor on. Тот же результат, что и 3a)
Многие из связанных тем предполагают решения, но ни одно из них не работает для меня. Единственное отличие, которое я могу увидеть, выполняя скрипт локально или через ssh, заключается в том, что есть вывод чего-то вроде
powershell started on <mywin10pc> with process ID xxxxx
Кроме этого я не могу сказать, что происходит. Я ставлю echo 0 в конце скриптов, чтобы проверить, был ли он выполнен или нет. Он всегда возвращает мне 0. Кто-нибудь знает, что я упускаю? Особенно странно для меня 3b), так как он работает для отправки монитора в спящий режим.
решение1
Проблема в том, что пробуждение монитора и перевод компьютера в активное состояние — это две разные вещи. Отправка -1 для пробуждения монитораделаетРазбудить дисплей. К сожалению, этого недостаточно, чтобы разбудить и компьютер. Для этого можно использовать SetThreadExecutionState
. Вот рабочий пример пакета:
@ECHO OFF
:: gather session handle
FOR /F "usebackq tokens=4" %%s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO SET hsession=%%s
:: wake display
psexec -accepteula -nobanner -d -i %hsession% -w "%windir%" powershell -NoProfile -NoLogo -Command "(Add-Type '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,-1)"
CALL :wait 2
:: reactivate session
psexec -accepteula -nobanner -d -i %hsession% -w "%windir%" powershell -NoProfile -NoLogo -Command "$x=Add-Type '[DllImport(\"kernel32.dll\")]public static extern void SetThreadExecutionState(uint esFlags);' -name System -namespace Win32 -passThru;$x::SetThreadExecutionState([uint32]\"0x03\");Sleep 5;$x::SetThreadExecutionState([uint32]\"0x40\");"
CALL :wait 2
GOTO:EOF
:wait
SET dowait=%~1
IF "%dowait%"=="" SET dowait=10
ping -n %dowait% 127.0.0.1 >NUL
GOTO:EOF
В некоторых средах можно использовать только SetThreadExecutionState
команды, но это не на 100% надежно в моем тестировании. Это также не разбудит устройства, которые его не поддерживают.
решение2
Вы, возможно, действительно слишком много думаете об этом. Вы просто хотите, чтобы мониторы не спали? Или вы хотите, чтобы они включались только после того, как выключатся? Я использовал программу под названиемШевелим мышьюв прошлом. Он просто перемещает мышь на 1 пиксель влево и вправо после указанного вами времени. Вы не замечаете движения, когда вы фактически используете мышь, но он будет поддерживать экраны активными (и имеет дополнительное преимущество, показывая вас как активного в большинстве приложений для обмена мгновенными сообщениями, таких как Lync или Slack)