TScreen.Monitorsがモニターの変更に対応していない

提供: Support
移動先: 案内検索

問題

マルチモニターを利用している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の適用方法は、以下のドキュメントを参照してください。