スリープ復帰や再起動しても画面が真っ暗のまま映らないとき(Windows10)

目次

画面が真っ暗のまま映らないときがある

デュアルモニターで使用しているWindows10 PCのサブディスプレイとして、PHILIPSの液晶ディスプレイ276E7EDAB/11を使っています。

買って数年が経つのですが、再起動やスリープ復帰時にこのサブモニターのみ真っ暗のままになることがあります。電源ランプは点灯していて、うっすらバックライトも点灯してしているので、モニター自体は動作しているのですが、何も表示されずに困ることがあります。メインモニターは別のメーカー製で特にこのような症状はありません。

単独モニターにしたりGPUを変更してもダメだった

サブディスプレイにしたのがいけないのかな?とモニターを単独の一つにしてみたり、マザーボード内臓のオンボードGPU(Intel HD Graphics 4600)からの出力や、PCIeに挿したグラフィックカード(NVIDIA GeForce)の出力端子をDVI・VGA・HDMIに入れ替えてみても症状は変わりませんでした。

信号無し状態から20秒以上経過してからは正常表示される

PCをスリープさせたり、シャットダウンすると、モニターが20秒以上映像信号が途切れた状態になり、モニターの電源ランプが点滅し始め、スタンバイ状態になります。モニターがスタンバイになっている状態からPCの起動やスリープ復帰をすれば、ちゃんと映像が表示されました。

どうやらPCからの映像信号が途切れてからモニターがスリープに入るまでの20秒間に再起動やスリープ復帰時した際、モニター側がうまく映像信号を受信できないようです。これはモニターの仕様なのかもしれません。PC起動時にBIOS/UEFIの画面が表示されないときがあり、モニターがスリープの状態からの起動であれば表示されました。

マザーボードとの相性が原因?!

ネットでいろいろ調べると、マザーボードとディスプレイの相性の問題のような投稿が目につきました。オーバークロック関連のBIOSの設定で、PLL(Phase Locked Loop)がどうこうで、これを無効にればOKとか海外の投稿がヒットしたりしましたが、オーバークロックはしたことないし意味が理解できず、BIOSの設定をいろいろ変更してみましたが解決できませんでした。

ちなみに、現在使用している環境はマザーボードがASROCK Z97 Extreme 6で、グラフィックカードはGeForce 1050 Tiです。これが本当なら、このマザーボードとPHILIPS 276E7EDAB/11の組み合わせが悪いというこになります。他のマザーボードや異なる仕様のPCが無いので、このモニターに別のPCを接続したらどうなるのかは試せていません。

いくつかの解決策

バッチファイルで解決する方法

以下のソースはデュアルモニターの使用を一時的にやめて、モニターがスタンバイ状態になる20秒を待ち、再度サブモニターを拡張モニターとして使用開始するというもので、Windows+Pを押してモニターを切り替えるのを自動化したものです。

うまくいったのですが、モニターがスリープ状態になるまで20秒待たないといけないのと、サブディスプレイに表示されていたウィンドウがメインモニターに寄せられるのがネックです。timeoutの秒数はお使いのモニターがスリープモードに入る秒数に合わせて変更してください。

DisplaySwitch.exe /internal
timeout 20
DisplaySwitch.exe /extend
exit

「WakeDisp2.exe」を使う方法

以下のページにこのEXEがどういうものか何も説明がないのですが、ファイル名から想像できると思いますがスリープ状態の画面を起こすEXEです。どっかのページに紹介があって辿り着きました。

「WakeDisp2.exe」と使うためには以下のページからWakeDisp2.zipをダウンロードして解凍します。

出てきたWakeDisp2.exeを適当な場所に保存します。

ダブルクリックして一度起動して置けば再起動してもタスクバーに常駐してくれて、スリープ復帰や再起動時には確実にモニターが表示されるようになりました。Windows 10でも使用できました。

アプリの常駐を終了させたい場合は、上記のアイコンを右クリックして「Quit」をクリックすればタスクバーからアイコンが消えます。アプリをパソコンから削除したい場合は、この後にWakeDisp2.exeを削除します。

うまくいかない時はPowershellと組み合わてみる

WakeDisp2.exeを起動してもうまくいかないときは、以下のPowershellを試してみてください。これを実行すると、まず映像信号を停めてモニターが消灯(真っ暗)にして、モニターがスタンバイ状態になる20秒を待ちます。20秒後にWakeDisp2.exeを実行して、スタンバイ状態だったディスプレイを点灯させます。実行中は画面が真っ暗になるだけで、PC自体がスリープする訳ではありありません。音楽を聴いている最中でも音が流れたまま画面だけがスタンバイ状態になり、そこから復帰します。私の環境ではこれでバッチリ解決できました。

PoweShellのスクリプトソース
$methods = @'
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool PostMessage(uint hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
'@

$pwm = Add-Type -MemberDefinition $methods -Name "PowerManager" -PassThru -Language CSharp

#モニターの電源をオフにする 2
$pwm::PostMessage(0xffff, 0x0112, 0xf170, 2)

#モニターがスタンバイ状態になるまでの待ち時間(秒)
sleep 20

#モニターの電源をオンにする -1
#これは効かないのでコメントアウト
#$pwm::PostMessage(0xffff, 0x0112, 0xf170, -1)
#$pwm::LockWorkStation()

#WakeDisp2.exeからモニターの電源をオンにする

#パスを直接指定する場合
#C:\WakeDisp2\WakeDisp2.exe -wake

#現在のパスを取得して実行する場合
$cd = Convert-Path ./
$exe = Join-Path -Path $cd -ChildPath WakeDisp2.exe
Start-Process -FilePath $exe -ArgumentList "-wake"

sleep 20の20秒というのは、僕が使っているモニターがスタンバイ状態(スリープモード)になるまでの秒数で、お使いのモニターによって秒数を変更してくだい。

このPowerShelのスクリプトを実行するバッチファイルを作り、PC起動時に自動実行できるように、タスクスケジューラに登録すると手動で実行する手間も省くことができます。

タスクスケジュールに登録する場合、管理者として実行させるめ「最上位特権で実行する」にチェックを入れないとエラーが出て正常に動きませんので、ご注意ください。

PoweShell起動用のバッチファイルの内容
@echo off

echo.
echo モニターを再起動します。
echo.

powershell Set-ExecutionPolicy RemoteSigned

powershell "%~dp0displaySleepToWakeup.ps1"

rem PowerShell側からエラーでWakeDisp2.exeが起動できないときは
rem このバッチファイル側から実行する
%~dp0WakeDisp2.exe -wake

powershell Set-ExecutionPolicy Restricted

exit /b

ハイブリッドスリープとハイバネーションの無効化

これは試してみて効果がありませんでしたが、以下のページによるとハイブリッドスリープハイバネーション無効化するといいみたいです。

ちなみに私の環境では 「ハイブリッドスリープ を許可する」オンになっていました。

グラフィックドライバーをリセットする

これも効果がありませんでしたが、Windows+Ctrl+Shift+Bを同時に押せばグラフィックドライバーがリセットされます。表示解像度がおかしいときに使うと正しい解像度で再表示してくれます。環境によっては、再起動やスリープ復帰で真っ暗だった画面が正常に表示されるかもしれません。

その他参考ページ

前へ

2020年3月 Windows Update 月例更新プログラムの一覧とダウンロードリンク(Windows10/8.1)

次へ

Chromiumベースの新EdgeでFlashを有効にする方法と動作確認ページ