使用 ssh 喚醒監視器

使用 ssh 喚醒監視器

放棄幾個月後,我想重新審視這個看似非常簡單的想法。我想要一個腳本,可以在顯示器進入睡眠狀態後喚醒它們。我幾乎嘗試了我能想到的任何方法,請有人救我不要收養一隻狗,它會在這個過程中抓取骨形藍牙滑鼠並擺動它(是的,我很絕望)

到目前為止我做了什麼:

1)在遠端Win10機器上安裝OpenSSH(有效)

2)得到互動式 Windows 會話擁有實際會話的權限:

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

3a) 啟動其中一項許多保持 Windows 喚醒程式。這些不起作用,因為它們永遠不會由 psexec 或 powershell 啟動。或者至少,如果它們運行,它們將無法顯示並且什麼都不做。這適用於我嘗試啟動的任何過程。

3b)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 表示 ON)不會執行任何操作。

3c)現在我絕望地嘗試做一個滑鼠擺動/按鍵模擬ETC。

 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)

在當地以更高的權利執行作品。與 SSH 一起使用時會短暫彈出 powershell。不做任何滑鼠擺動。

3d) 使用舊的 nircmd.exe 監視器關閉或類似的專用開啟監視器實用程式。與 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 等大多數即時訊息應用程式中顯示您處於活動狀態的額外好處)

相關內容