文章目录

windows 系统提供了多屏显示的功能,首先第一步是获取屏幕个数

#获取屏幕个数 ##EnumDisplayDevicess 函数原型:

BOOL EnumDisplayDevices(
  _In_  LPCTSTR         lpDevice,
  _In_  DWORD           iDevNum,
  _Out_ PDISPLAY_DEVICE lpDisplayDevice,
  _In_  DWORD           dwFlags
);

  iDevNum:指定感兴趣的显示设备的索引值,操作系统通过索引值确定每一个显示设备。索引值是连续的整数。从0开始,例如:如果一个系统有三个显示设备,那么它们的索引值为0、1、2。

  lpdisplayDevice:DISPLAY_DEVICE结构的指针,该结构检索由iDevNum指定的显示设备的信息,在调用EnumDisplayDevices之前,必须以字节为单位把DISPLAY_DEVICE结构中cb元素初始化为DISPLAY_DEVICE结构的大小。 示例代码:

INT iNumber=0; 
BOOL bFlag=TRUE;

DISPLAY_DEVICE dd; 
ZeroMemory(&dd,sizeof(dd)); 
dd.cb =sizeof(dd);

DEVMODE devMode; 
ZeroMemory(&devMode,sizeof(devMode)); devMode.dmSize=sizeof(devMode);
do {
	bFlag =EnumDisplayDevices(NULL, iNumber,&dd,0);
	bFlag=bFlag&&EnumDisplaySettings(dd.DeviceName,ENUM_CURRENT_SETTINGS,&devMode);
	if(bFlag) 
		iNumber +=1;
}while(bFlag);

  其中iNumber中就为系统所带显示器的数量,网上很多地方都没有EnumDisplaySettings这一行,这样检测的结果并不准确,一般来说如果不加上上面的一行在只有一个设备的情况下获得的结果是5。

  其实除了利用 EnumDisplaySettings 还可以使用获取到的DISPLAY_DEVICE结构体的StateFlags成员与 标志位DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 相与得出是否是有效的桌面环境。    要获取一个显示器的信息,首先调 EnumDisplayDevices 并且设置参数lpDevice 为NULL,然后再次调用 EnumDisplayDevices 并且把 lpDevice 设置成第一次调用时候返回的DISPLAY_DEVICE.DeviceName 并且把iDevNum 设置成0,然后返回的 DISPLAY_DEVICE.DeviceString 就是显示器的名字了。    注意上面一段文字翻译自MSDN 具体的做法见后文所附代码。 ##GetSystemMetrics   用于得到被定义的系统数据或者系统配置信息MSDN。 只要设置nIndex为SM_CMONITORS 即可,这个直接从系统中获取显示器个数,比上面方法简单很多。

#读取显示器参数及其他参数

函数原型:

BOOL EnumDisplaySettings(
  _In_  LPCTSTR lpszDeviceName,
  _In_  DWORD   iModeNum,
  _Out_ DEVMODE *lpDevMode
);

参数含义可见MSDN   查询的数据存储在devMode中,常用的为dmPosition(为当前显示器的坐标位置),dmPelsWidth,dmPelsHeight(为当前显示器的分辨率)

一段示例代码:

// multi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int  i;
	int monitorNum;
	BOOL flag;
	DISPLAY_DEVICE dd,dd1;

	i = 0;
	flag = true;

	DEVMODE dm;
	
	do
	{
		ZeroMemory(&dm, sizeof(dm));
		dm.dmSize = sizeof(dm);

		ZeroMemory(&dd, sizeof(dd));
		dd.cb = sizeof(dd);

		ZeroMemory(&dd1, sizeof(dd1));
		dd1.cb = sizeof(dd1);

		flag = EnumDisplayDevices(NULL, i, &dd, 0);
		if(!flag )
			break;

		printf("name is %s\n",dd.DeviceName);
		printf("DeviceString is %s\n",dd.DeviceString);
		EnumDisplayDevices(dd.DeviceName, 0, &dd1, 0);
		printf("dd1 is %s\n",dd1.DeviceString);

		printf("DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is %d\n",dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP);
		EnumDisplaySettings(dd.DeviceName,ENUM_CURRENT_SETTINGS, &dm);
		printf("width is %d,height is %d \n",dm.dmPelsWidth,dm.dmPelsHeight);
		printf("\n\n");
		//printf("find\n");
	
		if (flag) i += 1;
			
	} while (flag);

	monitorNum = i;  // 总数量
	printf("SM_CMONITORS is %d;monitorNum is %d\n", GetSystemMetrics(SM_CMONITORS) ,monitorNum);

	return 0;
}

运行结果如下:

name is \\.\DISPLAY1
DeviceString is ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1
.1)
dd1 is 通用即插即用监视器
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is 1
width is 1366,height is 768


name is \\.\DISPLAY2
DeviceString is ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1
.1)
dd1 is
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is 0
width is 0,height is 0


name is \\.\DISPLAYV1
DeviceString is RDPDD Chained DD
dd1 is
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is 0
width is 0,height is 0


name is \\.\DISPLAYV2
DeviceString is RDP Encoder Mirror Driver
dd1 is
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is 0
width is 0,height is 0


name is \\.\DISPLAYV3
DeviceString is RDP Reflector Display Driver
dd1 is
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP is 0
width is 0,height is 0

SM_CMONITORS is 1;monitorNum is 5