我正在尝试使用EnumDisplayMonitors来创build每个监视器的dynamic数组,并存储DISPLAY_DEVICE结构。 为什么下面的代码不正确?
BOOL CALLBACK MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { MONITORINFOEX iMonitor; iMonitor.cbSize = sizeof(MONITORINFOEX); GetMonitorInfo(hMonitor, &iMonitor); if (iMonitor.dwFlags == DISPLAY_DEVICE_MIRRORING_DRIVER) { return true; } else { *reinterpret_cast<ScreenArray*>(dwData) = ScreenArray(&iMonitor); return true; }; }
调用使用
ScreenArray monitorArray[15]; int i = 0; EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, reinterpret_cast<LPARAM>(&monitorArray[i++]));
数组(monitorArray [0])中的第一个返回第二个监视器的正确信息,但monitorArray [1]是最大值。
编辑:解决我使用的方法只是实现我创build的function:
MonitorArray *mA = reinterpret_cast<MonitorArray*>(dwData); mA->addScreen(&iMonitor);
每个监视器都会调用一次回调函数,但是每次调用时,回调函数都不会通过数组递增。 你需要做更像这样的事情:
struct ScreenArrayInfo { ScreenArray *Array; int Count; int MaxCount; }; BOOL CALLBACK MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { MONITORINFOEX iMonitor; iMonitor.cbSize = sizeof(MONITORINFOEX); GetMonitorInfo(hMonitor, &iMonitor); if (iMonitor.dwFlags == DISPLAY_DEVICE_MIRRORING_DRIVER) { return true; } else { ScreenArrayInfo *info = reinterpret_cast<ScreenArrayInfo*>(dwData); if (info->Count == info->MaxCount) return false; info->Array[info->Count] = ScreenArray(&iMonitor); Info->Count++; return true; }; } ScreenArray monitorArray[15]; ScreenArrayInfo info; info.Array = monitorArray; info.Count = 0; info.MaxCount = 15; EnumDisplayMonitors(NULL, NULL, &MyInfoEnumProc, reinterpret_cast<LPARAM>(&info));
或者:
#include <vector> BOOL CALLBACK MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { MONITORINFOEX iMonitor; iMonitor.cbSize = sizeof(MONITORINFOEX); GetMonitorInfo(hMonitor, &iMonitor); if (iMonitor.dwFlags == DISPLAY_DEVICE_MIRRORING_DRIVER) { return true; } else { reinterpret_cast< std::vector<ScreenArray>* >(dwData)->push_back(ScreenArray(&iMonitor)); return true; }; } std::vector<ScreenArray> monitorArray; EnumDisplayMonitors(NULL, NULL, &MyInfoEnumProc, reinterpret_cast<LPARAM>(&monitorArray));
EnumDisplayMonitors
接受你传递的参数,并为每个监视器调用一次回调函数,每次传递相同的参数。 进入monitorArray
索引永远不会增加。 相反,你需要管理回调本身的索引。
这是一个自动构建系统中所有监视器矢量的小类。
struct MonitorRects { std::vector<RECT> rcMonitors; static BOOL CALLBACK MonitorEnum(HMONITOR hMon,HDC hdc,LPRECT lprcMonitor,LPARAM pData) { MonitorRects* pThis = reinterpret_cast<MonitorRects*>(pData); pThis->rcMonitors.push_back(*lprcMonitor); return TRUE; } MonitorRects() { EnumDisplayMonitors(0, 0, MonitorEnum, (LPARAM)this); } };
像这样使用它:
MonitorRects monitors; cout << "You have " << monitors.rcMonitors.size() << " monitors connected.";