Acorde o monitor com ssh

Acorde o monitor com ssh

Depois de desistir durante meses, gostaria de revisitar a ideia que parece tão incrivelmente simples. Quero ter um script que desperte meus monitores depois que eles forem colocados no modo de suspensão. Eu tentei quase todas as abordagens que consigo imaginar, por favor, alguém me salve de adotar um cachorro que pega um mouse bluetooth em forma de osso balançando-o no processo (sim, estou tão desesperado)

O que eu fiz até agora:

1) Instalando OpenSSH na máquina Win10 remota (funciona)

2)Recebendoa sessão interativa do Windows para ter autoridade sobre a sessão real:

FOR /F "usebackq tokens=4" %s IN (`tasklist /nh /fo table /fi "imagename eq explorer.exe"`) DO ...

3a) Iniciar um dosmuitosmantenha os programas do Windows ativados. Eles não funcionam porque nunca são iniciados pelo psexec ou pelo powershell. Ou pelo menos se forem executados, não serão exibidos e não farão nada. Isso serve para qualquer processo que eu tente iniciar.

3b) Use SendMessagecomo eu faço para mandá-lo dormir:

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)

Passar 2 como último parâmetro funciona perfeitamente para desligar o monitor. Passar qualquer outra coisa (por exemplo, -1 para ON) não faz nada.

3c) Agora desesperado tento fazer umsimulação de movimento do mouse/pressionamento de teclaetc.:

 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)

Obras executadas localmente com direitos elevados. O PowerShell aparece brevemente quando usado com SSH. Não faz nenhum movimento do mouse.

3d) usando o bom e velho monitor nircmd.exe desligado ou utilitários de ativação de monitor dedicados semelhantes. Mesmo resultado de 3a)

Muitos dos tópicos vinculados têm supostas soluções, mas nenhum deles funciona para mim. A única diferença que posso ver entre a execução do script localmente e via ssh é que há uma saída de algo como

powershell started on <mywin10pc> with process ID xxxxx

Fora isso, não tenho como dizer o que está acontecendo. Coloquei um echo 0 no final dos scripts para verificar se foi executado ou não. Sempre me dá 0. Alguém tem alguma ideia do que estou perdendo? Especialmente 3b) é estranho para mim, pois funciona para fazer o monitor dormir.

Responder1

O problema é que ativar o monitor e configurar o computador para um estado ativo são duas coisas diferentes. Enviando -1 para ativar o monitorfazative a tela. Infelizmente, também é insuficiente para ativar o computador. Para isso você pode usar SetThreadExecutionState. Aqui está um exemplo de lote de trabalho:

@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

É possível em alguns ambientes usar apenas os SetThreadExecutionStatecomandos, mas não é 100% confiável nos meus testes. Isso também não ativará dispositivos que não sejam compatíveis.

Responder2

Você pode estar realmente pensando demais nisso. Você quer apenas manter os monitores acordados? Ou você deseja especificamente que eles sejam ligados somente depois de desligados? Eu usei um programa chamadoMexa o mouseno passado. Ele simplesmente move o mouse 1 pixel para a esquerda e para a direita após um período especificado. Você não percebe o movimento quando está realmente usando o mouse, mas ele manterá as telas ativas (e tem o benefício adicional de mostrar que você está ativo na maioria dos aplicativos de mensagens instantâneas, como Lync ou Slack)

informação relacionada