Windows下提示显示器信息主要通过两个函数实现。一个是EnumDisplayDevices(), 另一个是EnumDisplayMonitors().
EnumDisplayDevices()枚举所有显示设备,而EnumDisplayMonitors枚举的是所有显示器。
显示设备和显示器不一样,比如显卡算显示设备,但是不是显示器。
EnumDisplayMonitors()还会枚举出不可见的伪显示器,如果只是想得到实际的显示器数目的话可以用GetSystemMetrics(SM_CMONITORS),该函数不包括虚拟显示器。
MonitorInfoex 和MonitorInfo 在这两个结构中保存着相应显示器的相关信息,如坐标、是否为主显示器等
GetMonitorInfo ( )  取得指定显示器的相关信息,如物理显示区大小等
MonitorFromPoint ( )  取得指定点所在的显示器句柄
MonitorFromRect ( )  取得指定矩形所在的显示器句柄
MonitorFromWindow( )  取得指定窗口所在的显示器句柄
MonitorEnumProc( ) 当应用程序调用EnumDisplayMonitors ( )查询显示器个数时,系统自动为每一个显示器调用一次该函数。应用程序可以依此判断显示器的个数、位置及显示区域的大小等信息
函数名:MonitorEnumProc()
输入参数:HMONITOR hMonitor ---显示器句柄
          HDC hdcMonitor  ----显示器DC句柄
        LPRECT lprcMonitor-----
        LPARAM dwData-----EnumDisplayMonitors传来的数据
返回:bool
功能:若返回为真,EnumDisplayMonitors继续枚举,
      若返回为假,EnumDisplayMonitors停止枚举,从而获得显示器信息
MonitorAdapter.h
#include <atlstr.h>
#include <vector>
#include <WinDef.h>
#include <tchar.h>
using std::vector;using namespace std;#define MAX_MONITOR_NAME 256static std::vector<HMONITOR> g_hMonitorGroup;  // 显示器模式信息
typedef struct MonitorModeInfo_t
{unsigned int m_nWidth;             unsigned int m_nHeight;MonitorModeInfo_t(int nWidth, int nHeight) : m_nWidth(nWidth), m_nHeight(nHeight) {}
}MonitorModeInfo;// 显示器信息
struct MonitorInfo
{TCHAR szDevice[MAX_MONITOR_NAME];                  // 显示器名称std::vector<MonitorModeInfo> m_vecModeInfo;           // 当前名称的显示器支持的分辨率模式
};typedef std::vector<MonitorInfo> VEC_MONITORMODE_INFO;  // 所有的显示器信息 class MonitorAdapter
{
public:MonitorAdapter();~MonitorAdapter();// 回调函数static int CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdc,LPRECT lpRMonitor,LPARAM dwData);// 得到所有显示器的名称void GetAllMonitorName(VEC_MONITORMODE_INFO& m_vecMonitorListInfo);// 得到所有显示器的模式void GetAllDisplayMode(VEC_MONITORMODE_INFO& m_vecMonitorListInfo);//得到屏幕当前分辨率void GetCurrentReselotion(int& nWidth,int& nHeight,int& nFreq,int& nBits);//根据屏幕ID取获取屏幕的对应分辨率void GetCurrentReselotion(LPCWSTR lpszDeviceName, int& nWidth, int& nHeight, int& nFreq, int& nBits);//修改分辨率int ChangMonitorReselotion(HMONITOR hMonitor,const int nWidth,const int nHight,const int nFre,const int nColorBits);
};
MonitorAdapter.cpp
#include "stdafx.h"
#include "MonitorAdapter.h"MonitorAdapter::MonitorAdapter(void)
{
}MonitorAdapter::~MonitorAdapter(void)
{
}int CALLBACK MonitorAdapter::MonitorEnumProc(HMONITOR hMonitor, HDC hdc,LPRECT lpRMonitor,LPARAM dwData)
{g_hMonitorGroup.push_back(hMonitor);return 1;
}// 得到所有显示器的名称
void MonitorAdapter::GetAllMonitorName(VEC_MONITORMODE_INFO& vecMonitorListInfo)
{g_hMonitorGroup.clear();::EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0);//vector<HMONITOR>::iterator ithMoniter = g_hMonitorGroup.begin();for(int i = 0; i < g_hMonitorGroup.size();i++){MONITORINFOEX mixTemp;memset(&mixTemp, 0, sizeof(MONITORINFOEX));mixTemp.cbSize = sizeof(MONITORINFOEX);GetMonitorInfo(g_hMonitorGroup[i], &mixTemp);VEC_MONITORMODE_INFO::iterator itBeg = vecMonitorListInfo.begin();VEC_MONITORMODE_INFO::iterator itEnd = vecMonitorListInfo.end();for(; itBeg != itEnd; ++itBeg){if( 0 == _tcscmp(mixTemp.szDevice, itBeg->szDevice)){break;}}//没有在列表中找到,则需要添加if (itBeg == itEnd)       {MonitorInfo tmpMonitorInfo;_tcscpy_s(tmpMonitorInfo.szDevice, sizeof(tmpMonitorInfo.szDevice), mixTemp.szDevice);vecMonitorListInfo.push_back(tmpMonitorInfo);}}
}// 得到所有显示器的模式
void MonitorAdapter::GetAllDisplayMode(VEC_MONITORMODE_INFO& vecMonitorListInfo)
{GetAllMonitorName(vecMonitorListInfo);bool      bRetVal;DEVMODE     devmode;VEC_MONITORMODE_INFO::iterator itBeg = vecMonitorListInfo.begin();VEC_MONITORMODE_INFO::iterator itEnd = vecMonitorListInfo.end();for (NULL; itBeg != itEnd; ++itBeg){int iMode = 0;do{bRetVal = ::EnumDisplaySettings(itBeg->szDevice, iMode, &devmode);iMode++;if (bRetVal){bool bFind = false;vector<MonitorModeInfo>::iterator itBeg_Mode = itBeg->m_vecModeInfo.begin();vector<MonitorModeInfo>::iterator itEnd_Mode = itBeg->m_vecModeInfo.end();for (NULL; itBeg_Mode != itEnd_Mode; ++itBeg_Mode){// 如果已经在列表中找到,则结束本次循环if ((itBeg_Mode->m_nWidth == devmode.dmPelsWidth) && (itBeg_Mode->m_nHeight == devmode.dmPelsHeight)){bFind = true;break;}// 插入数据时,从 大到小排列 (按windows 分辨率设置,优先比较 宽) if ((itBeg_Mode->m_nWidth < devmode.dmPelsWidth) ||((itBeg_Mode->m_nWidth == devmode.dmPelsWidth) && (itBeg_Mode->m_nHeight < devmode.dmPelsHeight))){                           break;}}if(!bFind){if (itBeg_Mode == itEnd_Mode){itBeg->m_vecModeInfo.push_back(MonitorModeInfo(devmode.dmPelsWidth, devmode.dmPelsHeight)); }else{itBeg->m_vecModeInfo.insert(itBeg_Mode, MonitorModeInfo(devmode.dmPelsWidth, devmode.dmPelsHeight)); }}}}while (bRetVal); }
}int MonitorAdapter::ChangMonitorReselotion(HMONITOR hMonitor,const int nWidth,const int nHight,const int nFre,const int nColorBits)
{if ( NULL == hMonitor ){return -1;}MONITORINFOEX mi;mi.cbSize = sizeof(mi);GetMonitorInfo( hMonitor , &mi);DEVMODE DeviceMode;ZeroMemory(&DeviceMode, sizeof(DEVMODE));DeviceMode.dmSize = sizeof(DEVMODE); BOOL bFlag = TRUE;bFlag = EnumDisplaySettings(mi.szDevice, ENUM_CURRENT_SETTINGS, &DeviceMode);if ( bFlag != TRUE ){return -1;} if (DeviceMode.dmPelsWidth == nWidth && DeviceMode.dmPelsHeight == nHight ){return 0;}DeviceMode.dmDisplayFlags = 0;DeviceMode.dmPelsWidth= nWidth;       DeviceMode.dmPelsHeight = nHight;DeviceMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY ;int nRet = ChangeDisplaySettingsEx(mi.szDevice, &DeviceMode, NULL, CDS_GLOBAL | CDS_NORESET | CDS_UPDATEREGISTRY, NULL);if (DISP_CHANGE_BADMODE == nRet){ChangeDisplaySettingsEx(mi.szDevice, &DeviceMode, NULL, CDS_GLOBAL | CDS_NORESET | CDS_UPDATEREGISTRY, NULL);      }if ( DISP_CHANGE_SUCCESSFUL == nRet ){return 0;}return -1;
}void MonitorAdapter::GetCurrentReselotion(int& nWidth,int& nHeight,int& nFreq,int& nBits)
{DEVMODE DeviceMode;EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DeviceMode);nWidth = DeviceMode.dmPelsWidth;nHeight = DeviceMode.dmPelsHeight;nFreq = DeviceMode.dmDisplayFrequency;nBits = DeviceMode.dmBitsPerPel;
}void MonitorAdapter::GetCurrentReselotion(LPCWSTR lpszDeviceName, int& nWidth, int& nHeight, int& nFreq, int& nBits)
{DEVMODE DeviceMode;EnumDisplaySettings(lpszDeviceName, ENUM_CURRENT_SETTINGS, &DeviceMode);nWidth = DeviceMode.dmPelsWidth;nHeight = DeviceMode.dmPelsHeight;nFreq = DeviceMode.dmDisplayFrequency;nBits = DeviceMode.dmBitsPerPel;
}
test

#include "stdafx.h"
#include "MonitorAdapter.h"int _tmain(int argc, _TCHAR* argv[])
{MonitorAdapter         m_monitorAdapter;       //显示器VEC_MONITORMODE_INFO vecMointorListInfo;m_monitorAdapter.GetAllDisplayMode(vecMointorListInfo);int nWidth = 0, nHeight = 0, nFreq = 0, nBits = 0;VEC_MONITORMODE_INFO::iterator itBeg = vecMointorListInfo.begin();for (int i = 0; i < vecMointorListInfo.size();i++){//得到当前显示器分辨率 刷新率 色位m_monitorAdapter.GetCurrentReselotion(itBeg->szDevice, nWidth, nHeight, nFreq, nBits);itBeg++;nWidth = 0, nHeight = 0, nFreq = 0, nBits = 0;}return 0;
}

关于获取多个屏幕分辨率以及进行一些设置相关推荐

  1. adb 查看屏幕大小_Android应用开发之adb命令如何获取android手机屏幕分辨率

    本文将带你了解Android应用开发之adb命令如何获取android手机屏幕分辨率,希望本文对大家学Android有所帮助 #### 1.   通用方法: adb shell dumpsys win ...

  2. JS获取客户端信息(屏幕分辨率、浏览器版本、操作系统版本)

    废话就不多说了,直接上JS代码,如下: /*** 获取浏览器版本* @returns*/ function getBrowserInfo(){var agent = navigator.userAge ...

  3. js获取操作系统以及屏幕分辨率

    嗨害嗨,好久不见,我又来了奥.今天有人问了一个这样的问题,就是如何获取屏幕的分辨率,还有操作系统.因为他做的项目接口需要传的参数中包括这两样.我搜索了并且整理了一下. 获取操作系统的话,bom有一个对 ...

  4. mfc获取别的计算机是否在线,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  5. mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  6. Android开发笔记(三)屏幕分辨率

    在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便. 不便一:下面代码中的getWidth和getHeight在adt上提示deprecated ...

  7. Android 屏幕适配之屏幕分辨率(创建不同dimen)适配

    由于目前流行的Android屏幕分辨率太多,再加上UI同事设计时经常使用px单位来设计,所以导致编写Android代码时适配是一个很大的问题. 以下是本人开发过程中的适配方案 仅供参考 附:目前手机主 ...

  8. Ubuntu 16.04 LTS设置屏幕分辨率并永久保存所设置的分辨率

    更多内容请关注https://www.cnblogs.com/huangrenhui/ 一.问题: 1.新装完Ubuntu 16.04 LTS后,进入系统打开命令行窗口,界面的分辨率显示是最小的: 2 ...

  9. JS获取当前对象大小以及屏幕分辨率等...

    <!DOCTYPE html> <html> <head><meta charset="utf-8"/><meta name= ...

最新文章

  1. IE9会颠覆传统的上网模式?
  2. 20170728上课笔记
  3. spring boot 修改 jackson string的null为空字符串
  4. php 导出csv 转义 逗号转义,在csv php中转义换行符
  5. PHP迸发,PHP 开发 「十宗罪」
  6. java图片片识别中文_Java中使用tess4J进行图片文字识别(支持中文)
  7. P2617 Dynamic Rankings
  8. 数据结构和算法9——哈希表
  9. 硬盘整数分区计算方法(精确硬盘分区算法)
  10. Subsonic使用
  11. Sprinboot支付宝h5支付、退款(java版)
  12. 360 2019校招笔试题第一题 表面积
  13. MDK5的watch窗口变量删除问题
  14. NVIDIA RTX A6000深度学习训练基准
  15. 6000字长文,终于将数据中台架构体系讲明白了
  16. ViewPager详解
  17. return 和return:redirect:/**
  18. android IPC通信(下)-AIDL
  19. R语言导出CSV出现乱码的处理
  20. python统计字母a的个数_32个经典Python小例子测测你的基础知识(11-20)

热门文章

  1. hql分页获取数据总数_最简洁的分页插件PageHelper
  2. django开发中安装包时遇到的 关于 read timed out的问题的解决
  3. pd17虚拟机启动器怎么生成?快来看看吧
  4. fcpx插件Title Pop:78个可自定义的Final Cut Pro X动画标题+ 2个额外背景
  5. P3146 [USACO16OPEN]248 G(python3实现)
  6. 【原型设计】第五节:Axure RP9 交面交互的使用说明 02 显示隐藏元素
  7. mailbox 编程_往死里写——从站mailbox实现 | 学步园
  8. divcss布局模板代码_CSS3布局(前端所必须要掌握)
  9. PythonRabbitmq文档阅读笔记-生产者数据直接送入队列消费者消费
  10. Python笔记-解决开启Fiddler后Requests存在SSLError问题