画面の解像度やモニター座標を知る方法はいくつかあります。
簡単なのはGetSystemMetrics関数を使う方法で、プライマリモニターの情報を取得できます。
マルチモニターな環境な場合はEnumDisplayMonitors関数を使うと、各モニターそれぞれの解像度などを取得する事が可能になります。
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 ・・・ モニターのデバイス名
コメントをお書きください