CMultiMonitorEnumerator.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #ifndef CMULTIMONITORENUMERATOR_H
  2. #define CMULTIMONITORENUMERATOR_H
  3. #include <windows.h>
  4. #include <vector>
  5. class CMultiMonitorEnumerator
  6. {
  7. public:
  8. CMultiMonitorEnumerator()
  9. {
  10. m_iMontorNumber = 0;
  11. EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)this);
  12. }
  13. int getMontorNumber()
  14. {
  15. return m_iMontorNumber;
  16. }
  17. protected:
  18. //枚举显示器回调函数
  19. static BOOL CALLBACK MonitorEnumProc(
  20. HMONITOR hMonitor, // handle to display monitor
  21. HDC hdcMonitor, // handle to monitor-appropriate device context
  22. LPRECT lprcMonitor, // pointer to monitor intersection rectangle
  23. LPARAM dwData // data passed from EnumDisplayMonitors
  24. )
  25. {
  26. CMultiMonitorEnumerator *pThis = (CMultiMonitorEnumerator *)dwData;
  27. //GetMonitorInfo 获取显示器信息
  28. MONITORINFOEX infoEx;
  29. memset(&infoEx, 0, sizeof(infoEx));
  30. infoEx.cbSize = sizeof(infoEx);
  31. if(GetMonitorInfo(hMonitor, &infoEx))
  32. {
  33. DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId;
  34. UINT32 requiredPaths, requiredModes;
  35. GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
  36. std::vector<DISPLAYCONFIG_PATH_INFO> paths(requiredPaths);
  37. std::vector<DISPLAYCONFIG_MODE_INFO> modes(requiredModes);
  38. QueryDisplayConfig(QDC_DATABASE_CURRENT, &requiredPaths, paths.data(), &requiredModes, modes.data(), &currentTopologyId);
  39. if(currentTopologyId == DISPLAYCONFIG_TOPOLOGY_CLONE)
  40. {//复制屏
  41. pThis->m_iMontorNumber += paths.size();
  42. }
  43. else
  44. {
  45. pThis->m_iMontorNumber++;
  46. }
  47. return true; //continue the enumeration
  48. }
  49. return false; //stop the enumeration
  50. }
  51. private:
  52. int m_iMontorNumber;
  53. };
  54. #endif // CMULTIMONITORENUMERATOR_H