C++で画面の解像度を取得する

画面の解像度やモニター座標を知る方法はいくつかあります。

 

簡単なのはGetSystemMetrics関数を使う方法で、プライマリモニターの情報を取得できます。

マルチモニターな環境な場合はEnumDisplayMonitors関数を使うと、各モニターそれぞれの解像度などを取得する事が可能になります。

C#の場合はこちら↓

C#で画面の解像度を取得する

プライマリーモニターの解像度を取得する

プライマリモニター全体のサイズを取得

以下のように、引数にSM_CXSCREEN・SM_CYSCREENを使ってGetSystemMetrics関数を呼び出すと、プライマリーモニター解像度の幅・高さをそれぞれ取得する事が出来ます。

        int x = GetSystemMetrics(SM_CXSCREEN);
        int y = GetSystemMetrics(SM_CYSCREEN);

プライマリモニターの作業領域のサイズを取得

タスクバーを除いた作業領域のサイズを知りたい場合は、SystemParametersInfo関数を使用します。引数にSPI_GETWORKAREAを使うと、作業領域のモニター座標を取得する事が出来ます。

        RECT rect;
        SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);

※タスクバーが下にあるとは限りません

※RECT構造体のtop、leftを必ず考慮してコードを書くようにしましょう

全てのディスプレイの解像度を取得する

複数つないでいるモニター全ての情報を取得するには、EnumDisplayMonitors関数を使用します。

関数を呼び出すとモニターの数だけコールバック関数が呼び出されます。

 

コールバック関数に引数で渡されるモニターハンドルを使って、GetMonitorInfo関数を使用するとモニター毎の詳細情報を取得する事が出来ます。

BOOL CALLBACK MyMonitorEnumProc( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
{
    MONITORINFOEX monitorInfo;

    monitorInfo.cbSize = sizeof( monitorInfo );
    GetMonitorInfo( hMonitor, &monitorInfo );

    :

    return TRUE;
}


void Test() {

    :

    EnumDisplayMonitors( NULL, NULL, MyMonitorEnumProc, 0 );

    :

}

EnumDisplayMonitors呼び出し (18行目)

第1、第2引数をNULLで呼び出すと全てのモニターを取得できます。

  

コールバック関数 (1~11行目)

モニターの数だけ呼び出されます。

 

GetMonitorInfo呼び出し (5~6行目)

GetMonitorInfo呼び出し前にMONITORINFOEXのcbSizeへ構造体のサイズを必ずセットしておきます。その後GetMonitorInfoを呼び出すとMONITORINFOEXに情報が格納されます。

  

MONITORINFOEXで取得できる値は以下の通りです。

 

rcMonitor ・・・ モニター座標

rcWork   ・・・ モニターの作業範囲座標

dwFlags    ・・・ MONITORINFOF_PRIMARYフラグが立っていたらプライマリーモニター

szDevice  ・・・ モニターのデバイス名