C++ Builder XE4, 10.2 Tokyo > 모니터 해상도 > Bug > Screen->Monitors[0]의 Width와 Height가 이상해진다

운영 환경
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2

c++ builder > form > 모니터 해상도 얻기 > Screen->Monitors[0]->Width; / ->Height; // Screen->PrimaryMonitor->
10.2 Tokyo에서 시도하고 발견 한 문제.

code



Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 1. Monitors[]使用
    int width = Screen->Monitors[0]->Width;
    int height = Screen->Monitors[0]->Height;

    String msg = String().sprintf(L"Monitors[0]: W%d x H%d", width, height);
    Memo1->Lines->Add(msg);

// 2. PrimaryMonitor使用
    width = Screen->PrimaryMonitor->Width;
    height = Screen->PrimaryMonitor->Height;
    msg = String().sprintf(L"Primary: W%d x H%d", width, height);
    Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------

결과





Monitors[0]의 값이 이상해지는 조건이 있다.
상기에서는 2회 Button1을 누르고 있지만, 2회째의 값이 이상하다.

결함 발생 조건



1. VMware에서 재현



VMware상의 Windows 7(나 10등)에서 「모니터를 순환」에 의해 모니터수를 1에서 2로 변경했을 때에 발생한다.

2. 멀티 모니터로 재현



하나의 모니터와 연결된 상태에서 두 번째 모니터를 연결한 후에 발생합니다.

예상되는 상황



모니터가 고장 직후에 Monitors[0]의 Height, Width에 이상한 값이 들어가, 그것을 바탕으로 위치 계산하는 처리가 모두 실패한다.

소프트를 기동한 상태에서 모니터를 1대에서 2대로 늘리는 경우도 실패할지도 모른다.

코드에서 값이 이상하지 않은 PrimaryMonitor 사용을 고려하는 것이 좋습니다.

좋은 웹페이지 즐겨찾기