多屏幕显示

原创 2016年05月31日 09:33:05

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

参考:
多显示器的显示
VC多屏幕显示

版权声明:本文为博主原创文章,转载需注明链接。

相关文章推荐

多显示器的显示

本文分步骤介绍如何在 Windows XP 中配置和使用多台监视器。 Windows XP 可通过使用多台监视器扩大您的桌面,进而提高您的工作效率。一台计算机上可连接多达十台单独的监视器,借助于...

DISPLAY_DEVICE结构

DISPLAY_DEVICEThe DISPLAY_DEVICE structure receives information about the displaydevice specified by...

枚举display device

// #include "stdafx.h" #include #include #include #include void DetachDisplay(); int mai...

vc6中 EnumDisplayDevices 判断扩展屏幕,以及取得扩展屏幕的示例代码。

#define        SM_CMONITORS        80 //    int screen_count = ::GetSystemMetrics( SM_CMONITORS ); ...

获取显示器的个数

这几天需要支持多个显示器的问题,上网上找了很多,也查看了msdn,基本上算是成功了,但是还有点问题。下面先把代码贴出来,非常简单,就一个函数:   #if(WINVER typedef BOOL (C...
  • jszj
  • jszj
  • 2009年09月30日 09:52
  • 4181

vc6中 EnumDisplayDevices 判断扩展屏幕,以及取得扩展屏幕的示例代码。

#define        SM_CMONITORS        80 //    int screen_count = ::GetSystemMetrics( SM_CMONITORS ); ...

双屏/多显示器截屏

截屏程序的源码网上到处都有,但是基本都不支持多显示器。 这让我一度以为支持多显示器是一件很困难的事情。 (demo http://download.csdn.net/detail/prob...
  • problc
  • problc
  • 2011年12月12日 13:54
  • 8001

实现自定义view(2):仿Android QQ多屏幕显示ListView的效果

转载请注明出处。博客地址:http://blog.csdn.net/mylzc 本文在《仿 UC,墨迹天气左右拖动 多屏幕显示效果》的基础上对代码进行修改,模仿Android QQ主界面的分屏Lis...
  • mylzc
  • mylzc
  • 2011年09月19日 07:26
  • 15090

iOS 开发 高级:通过AirServer使用AirPlay镜像并实现多屏幕显示控制

AirPlay是iOS中一个很酷的功能,通过Wi-Fi连接支持AirPlay的设备,然后使用镜像功能就能在其他设备显示内容,播放声音。有很多大型的游戏都支持AirPlay,这样比如连接电视时,那么iP...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多屏幕显示
举报原因:
原因补充:

(最多只允许输入30个字)