EnumDisplayMonitorscallback

我正在尝试使用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.";