TScreen.Monitorsがモニターの変更に対応していない
問題
マルチモニターを利用しているWindowsシステムでは、モニターの電源をON/OFFした際、WindowsからWM_DisplayChangeメッセージを送信します。
例えば、アプリケーション側で、画面を表示する際にモニター画面の内外を判断し、表示領域に戻す対応を行っている場合、TScreen.MonitorsがWM_DisplayChangeメッセージを取得時にモニターを変更する処理に対応していないため、WorkAreaRectに返される値が不正確になり、その結果、アプリケーションがモニター画面から消える症状が発生します。
この問題は、Embarcadero Quality Portalへ以下のケースとして報告されております。
ケース番号 | タイトル |
---|---|
RSP-37708 | Handles in the TScreen.Monitors list are not updated when Windows sends WM_DisplayChange |
(Embarcadero Quality Portalへのログインは、EDNアカウントが必要)
解決
この問題は、RAD Studioの次期バージョン(RAD Studio 12)で修正される予定です。
RAD Studio11以前のバージョンでこの問題を解決したい場合は、<製品のインストールフォルダ>¥source¥vcl¥Vcl.Forms.pasを自身のプロジェクトフォルダへコピーし、修正してください。
以下の修正箇所のようにTApplication.WndProcメソッド内で、Msg変数のCase処理としてWM_DISPLAYCHANGEを追加し、Screen.GetMonitorsメソッドを呼び出してください。
Vcl.Forms.pas
procedure TApplication.WndProc(var Message: TMessage);
..
..
with Message do
case Msg of
..
..
WM_DISPLAYCHANGE: // 追加
Screen.GetMonitors; // 追加
..
修正したVcl.Forms.pasの適用方法は、以下のドキュメントを参照してください。