EnumDisplayMonitors
Win32 APIの関数を使用して、各ディスプレイに関する情報を取得できます。
必要な表示用の長方形ができたら、何をすべきかがわかります=)
ディスプレイは順番に列挙されていると確信しています。ただし、タイリングしている場合は、すべての表示長方形のベクトルを取得して、それらを並べ替えることができます。
すべてのモニター情報を取得するために、しばらく前に書いた便利なラッパーがあります。
宣言
class CMonitorInfoEx : public MONITORINFOEX
{
public:
CMonitorInfoEx();
LPCRECT GetRect() const { return &rcMonitor; }
LPCRECT GetWorkRect() const { return &rcWork; }
LPCTSTR DeviceName() const { return szDevice; }
bool IsPrimary() const { return (dwFlags & MONITORINFOF_PRIMARY) ? true : false; }
int Width() const { return rcMonitor.right - rcMonitor.left; }
int Height() const { return rcMonitor.bottom - rcMonitor.top; }
int WorkWidth() const { return rcWork.right - rcWork.left; }
int WorkHeight() const { return rcWork.bottom - rcWork.top; }
};
class CSysDisplays
{
public:
CSysDisplays();
void Update();
int Count() const;
const CMonitorInfoEx& Get( int i ) const;
private:
std::vector<CMonitorInfoEx> mInfo;
};
実装
BOOL CALLBACK MonitorEnumProc( __in HMONITOR hMonitor, __in HDC hdcMonitor, __in LPRECT lprcMonitor, __in LPARAM dwData )
{
std::vector<CMonitorInfoEx>& infoArray = *reinterpret_cast< std::vector<CMonitorInfoEx>* >( dwData );
CMonitorInfoEx info;
GetMonitorInfo( hMonitor, &info );
infoArray.push_back( info );
return TRUE;
}
CMonitorInfoEx::CMonitorInfoEx()
{
cbSize = sizeof(MONITORINFOEX);
}
CSysDisplays::CSysDisplays()
{
Update();
}
void CSysDisplays::Update()
{
mInfo.clear();
mInfo.reserve( ::GetSystemMetrics(SM_CMONITORS) );
EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(&mInfo) );
}
int CSysDisplays::Count() const
{
return (int)mInfo.size();
}
const CMonitorInfoEx& CSysDisplays::Get( int i ) const
{
return mInfo[i];
}