枚举多显示器信息 EnumDisplayMonitors 应用

class CMultiMonitorEnumerator
{
public:
  int m_iMontorNumber;
  typedef struct _tagVMonitorInfo_t
  {
    HMONITOR hMonitor; //显示器句柄
    TCHAR szDevice[32]; //显示器名
    RECT rcVirtual; //虚拟显示屏坐标
    RECT rcMonitor; //物理显示坐标
    RECT rcWork; //工作显示坐标
    BOOL bPrimary; //主显示器?

    _tagVMonitorInfo_t()
    {
      memset(this, 0, sizeof(*this));
    }
  }VMONITORINFO, *LPVMONITORINFO;

  //显示器信息列表
  VMONITORINFO m_MonitorInfoExArray[64];

protected:
  //枚举显示器回调函数
  static BOOL CALLBACK MonitorEnumProc(
    HMONITOR hMonitor,  // handle to display monitor
    HDC hdcMonitor,     // handle to monitor-appropriate device context
    LPRECT lprcMonitor, // pointer to monitor intersection rectangle
    LPARAM dwData       // data passed from EnumDisplayMonitors
    )
  {
    CMultiMonitorEnumerator *pThis = (CMultiMonitorEnumerator *)dwData;
        
    //The rectangle coordinates are virtual-screen coordinates
    if(lprcMonitor)
    {
      TRACE(_T("%p (l=%d t=%d r=%d b=%d)\n"), 
        hMonitor,
        lprcMonitor->left, lprcMonitor->top,
        lprcMonitor->right, lprcMonitor->bottom);
    }
    
    //GetMonitorInfo 获取显示器信息
    MONITORINFOEX infoEx;
    memset(&infoEx, 0,  sizeof(infoEx));
    infoEx.cbSize = sizeof(infoEx);
    if(GetMonitorInfo(hMonitor, &infoEx))
    {
      TRACE(_T("%p [%s] %s rcMonitor(l=%d t=%d r=%d b=%d) rcWork(l=%d t=%d r=%d b=%d)\n"),
        hMonitor,
        infoEx.szDevice,
        infoEx.dwFlags == MONITORINFOF_PRIMARY? _T("Primary"):_T("Slave"),
        infoEx.rcMonitor.left, infoEx.rcMonitor.top, infoEx.rcMonitor.right, infoEx.rcMonitor.bottom,
        infoEx.rcWork.left, infoEx.rcWork.top, infoEx.rcWork.right, infoEx.rcWork.bottom);
    }
    
    //保存显示器信息
    if(pThis->m_iMontorNumber < _countof(pThis->m_MonitorInfoExArray) - 1)
    {
      VMONITORINFO *pInfo = &pThis->m_MonitorInfoExArray[pThis->m_iMontorNumber];
      pInfo->hMonitor = hMonitor;
      if(lprcMonitor)
      {
        pInfo->rcVirtual = *lprcMonitor;
      }
      pInfo->rcMonitor = infoEx.rcMonitor;
      pInfo->rcWork = infoEx.rcWork;
      pInfo->bPrimary = infoEx.dwFlags == MONITORINFOF_PRIMARY;
      _tcscpy_s(pInfo->szDevice, infoEx.szDevice);

      pThis->m_iMontorNumber++;

      return TRUE; //continue the enumeration
    }
    
    return FALSE; //stop the enumeration
  }

public:
  CMultiMonitorEnumerator()
  {
    m_iMontorNumber = 0;
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)this);

  }
};


//测试实例 (将指定窗口移动到第二个显示器全屏显示)

CMultiMonitorEnumerator mMultDisplayEnum;
if(mMultDisplayEnum.m_iMontorNumber > 1) //多于一个显示器
{
  CMultiMonitorEnumerator::VMONITORINFO *pvInfo = &mMultDisplayEnum.m_MonitorInfoExArray[1];
  MoveWindow( &pvInfo->rcVirtual );
}


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值