透過 OpenSSH 關閉 Win10 顯示器

透過 OpenSSH 關閉 Win10 顯示器

在Windows10機器上本地關閉顯示的解決方案有很多。它們都是以下 SendMessage 行的某種形式。還有一些可執行檔(例如 nircmd)可以執行此操作。然而,透過 OpenSSH 運行其中任何一個似乎都存在一些限制。由於我的 OpenSSH 配置為使用與本機使用者完全相同的憑證,我無法真正弄清楚為什麼沒有任何反應。 ps 腳本版本傳回一個簡單的 1,而像 nircmd 這樣的解決方案根本不會回傳任何內容。甚至沒有一個錯誤。知道這裡可能發生什麼以及如何使其發揮作用嗎?

範例腳本:

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,2)

來源

編輯:也許我應該添加其他尼爾命令靜音音訊等選項可以正常工作。

答案1

這是因為互動式 Windows 會話不是當前會話,因此它不是在主動連接實體顯示器的上下文中運行。聲音和其他功能是,但顯示與會話相關。您可以互動式登錄,也可以使用 psexec 之類的東西在使用者上下文中執行 powershell 進程。如果您可以使用 psexec 那麼您可以使用以下命令:

 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 int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)

不過,您將需要 psexec。

如果有多個互動會話,則會執行多次。

如果從批次運行,您需要將兩個 %s 替換為 %%s。

這是收集互動式會話的部分:

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

可以將以下內容複製到批次檔中並從終端模擬器執行。

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 -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,2)"
)

唯一的區別是每個都%s更改為%%s.

請注意,在您嘗試停用顯示器的電腦上以互動方式運行它可能會失敗。這是因為您的互動式會話仍然處於活動狀態。

要喚醒螢幕,您可以使用以下命令(經過測試並在我的幾台裝置上運行):

:: 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

相關內容