
何ヶ月も諦めていましたが、信じられないほどシンプルに思えるアイデアをもう一度試してみたいと思います。モニターをスリープ状態にした後、再び起動するスクリプトが欲しいのです。思いつく限りのアプローチをほぼすべて試しました。骨の形をした Bluetooth マウスを揺らしながら拾ってくる犬を飼うところから私を救ってください (そう、私はそれほど切羽詰まっているのです)
これまでやったこと:
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) を渡しても何も起こりません。
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)
昇格された権限でローカルに実行されます。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 などのほとんどのインスタント メッセージング アプリケーションでアクティブとして表示されるという利点もあります)。