- 使用 ::EnumDisplayMonitors
// 用一个全局函数(回调函数)获得第二个屏幕的大小 //
// 在OnInitDialog()中调用 //
CRect g_ScreenRect2;//第二块屏幕的大小
BOOL CALLBACK MonitorProc(HMONITOR hMonitor, HDC hdc, LPRECT lprc, LPARAM dwData)
{
CPacsCEFDlg* pThis = (CPacsCEFDlg*)dwData;
if (!(lprc->left == 0 && lprc->top == 0))
{
g_ScreenRect2 = *lprc;//获得第二个屏幕的大小
}
return 1;
}
在OnInitDialog中
// 获取第二个屏幕(扩展屏)的大小 //
HDC hdc = ::GetDC(NULL);
::EnumDisplayMonitors(hdc, NULL, MonitorProc, (LPARAM)this);
::ReleaseDC(NULL, hdc);
///
m_ScreenRect2 = g_ScreenRect2;
m_ScreenRect1.right = ::GetSystemMetrics(SM_CXSCREEN);
m_ScreenRect1.bottom = ::GetSystemMetrics(SM_CYSCREEN);
封装的类
// GetMonitorInfo 文件
#ifndef MONITORINFO_H_H_0001
#define MONITORINFO_H_H_0001
#include <vector>
#include <Windows.h>
using namespace std;
class MonitorInfo
{
private:
MonitorInfo(){ resetData(); }
~MonitorInfo() { }
MonitorInfo(const MonitorInfo&);
MonitorInfo& operator=(const MonitorInfo&);
public:
static MonitorInfo& getInstance()
{
static MonitorInfo instance;
return instance;
}
const MONITORINFO* getMonitorInfo(unsigned int nIndex)
{
if (nIndex<0 || nIndex >= s_vMonitorInfo.size())
return NULL;
return &s_vMonitorInfo[nIndex];
}
const vector<MONITORINFO>& getAllMonitorInfo()
{
return s_vMonitorInfo;
}
unsigned int getMonitorCount() { return s_vMonitorInfo.size(); }
private:
static std::vector<MONITORINFO> s_vMonitorInfo; // 保存多显示器信息
void resetData()
{
s_vMonitorInfo.clear();
::EnumDisplayMonitors(NULL, NULL, monitorEnumProc, 0);
}
static BOOL CALLBACK monitorEnumProc(
HMONITOR hMonitor, // handle to display monitor
HDC hdcMonitor, // handle to monitor DC
LPRECT lprcMonitor, // monitor intersection rectangle
LPARAM dwData // data
)
{
MONITORINFO mi;
mi.cbSize = sizeof(MONITORINFO);
::GetMonitorInfo(hMonitor, &mi);
s_vMonitorInfo.push_back(mi);
return TRUE;
}
};
std::vector<MONITORINFO> MonitorInfo::s_vMonitorInfo; // 保存多显示器信息
#endif
/*
使用方法:
const vector<MONITORINFO>& vMonitor = MonitorInfo::getInstance().getAllMonitorInfo();
size_t nCount = vMonitor.size();
*/
- 使用 EnumDisplayDevices() 和 EnumDisplaySettings()
// 多个屏幕的大小
vector<CRect> g_vMonitorsRect;
// 获取多个屏幕的大小
vector<CRect> GetMonitorsRect()
{
vector<CRect> vRet;
int n = GetSystemMetrics(SM_CMONITORS);//获取屏幕个数
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
DEVMODE devMode;
ZeroMemory(&devMode, sizeof(devMode));
devMode.dmSize = sizeof(devMode);
for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); ++i)
{
if (EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &devMode))
{
CRect rc;
int left = devMode.dmPosition.x;
int top = devMode.dmPosition.y;
int right = devMode.dmPosition.x + devMode.dmPelsWidth;
int bottom = devMode.dmPosition.y + devMode.dmPelsHeight;
rc.SetRect(left, top, right, bottom);
vRet.push_back(rc);
}
}
//g_vMonitorsRect = vRet;
return vRet;
}
// 获取当前鼠标所在屏幕的大小
CRect GetCurrentMonitorRect()
{
CRect rcRet;
CPoint point;
::GetCursorPos(&point);
static vector<CRect> vMonitorsRect = GetMonitorsRect();
for (const CRect& rc : vMonitorsRect)
{
if (::PtInRect(rc, point))
{
rcRet = rc;
break;
}
}
return rcRet;
}