多屏幕显示

原创 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多屏幕显示

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

枚举display device

// #include "stdafx.h" #include #include #include #include void DetachDisplay(); int mai...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2010年10月29日 13:52
  • 3638

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

#define        SM_CMONITORS        80 //    int screen_count = ::GetSystemMetrics( SM_CMONITORS ); ...
  • jennyvenus
  • jennyvenus
  • 2014年12月19日 13:21
  • 2967

基于RDP Encoder Mirror Driver的windows抓屏程序

  • 2016年06月22日 18:25
  • 12.04MB
  • 下载

windows 抓屏 基于RDP Mirror Driver

分享一个windows的抓屏方式 最近两周一直在测试windows下的各种抓屏方式。刚开始用了GDI的抓屏,但是出现了bug。抓屏一段时间后,出现了问题。MFC程序卡死,抓不到时实的屏幕数据了,回来的...
  • dzhw0314
  • dzhw0314
  • 2016年06月22日 17:57
  • 3423

Windows桌面共享中一些常见的抓屏技术

2014/11/06 (转载自http://www.cppblog.com/weiym/archive/2013/12/01/204536.html) 1. BitBlt ...
  • narutojzm1
  • narutojzm1
  • 2015年11月07日 16:49
  • 1182

多显示器编程--获取所有显示器的分辨率

最近需要在windows下进行多显示器编程,问题是:怎么样获取所有的显示器的分辨率(比如:有三个显示器M1、M2、M3,如何分别取得它们三个的分辨率) 下面是一些网友讨论的记录: ...
  • u012330231
  • u012330231
  • 2016年02月25日 08:49
  • 1387

双屏/多显示器截屏

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

Windows系统的多显示器模式的编程

这几天研究了一下Windows系统的多显示器模式的编程,实现了Windows下支持10显示器模式的通用com组件,这里做一个整理和回顾,希望能对再这方面开发的兄弟们有些启发和帮助:  (一) Wind...
  • Parfait
  • Parfait
  • 2007年06月27日 17:24
  • 3943

VC实现多屏显示

直接贴源码吧,vc2008调试通过。只贴多屏显示相关操作类。 h文件如下: /********************************************** Copyright(...
  • dominating_
  • dominating_
  • 2016年11月21日 14:51
  • 939

vc多屏显示介绍

转自:http://wenku.baidu.com/link?url=32eBGaJmpFy-7qufsAKvXjo6u9mdChtEiAR3RwzsL579BUT1Kry2IHiz8zdrRkTYe...
  • rankun1
  • rankun1
  • 2016年07月26日 16:25
  • 1502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多屏幕显示
举报原因:
原因补充:

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