辅助监视器的Getfriendlyname

时间:2015-10-01 15:57:49

标签: c++ windows msdn multiple-monitors device-name

我需要获取辅助监视器的设备名称。但是,当我只是尝试检索设备名称时,输出为DISPLAY1, DISPLAYV1等等。

但是,当我们检查屏幕分辨率时,我需要显示的名称,如此处提到的Displayname:

首先,我不确定从哪里可以获得这个字符串。在阅读时我猜它是设备的friendlyname。但是我不确定,因为在调用此函数时调用EnumDisplaySetting()一直给我Unhandled Exception: Could not access memory location。所以我无法验证友好名称究竟是什么。而且我认为未处理的异常是由于在DISPLAY_DEVICE中为driverextra的DISPLAY_DEVICE分配不正确而引起的。我相信这是因为:

  

如果iModeNum大于显示设备上一次图形模式的索引,则该功能失败。

提到here

另外,我不明白需要分配多少内存 DISPLAY_DEVICE-> dmDriverExtra,因为它已在同一链接中提及:

  

在调用EnumDisplaySettings之前,将dmSize成员设置为sizeof(DEVMODE),并设置dmDriverExtra成员以指示可用于接收私有驱动程序数据的额外空间的大小(以字节为单位)。

所以我的问题是多方面的:

  

1)需要为dmDriverExtra分配多少内存?

     

2)friendlyname是我在屏幕分辨率中访问“显示”选项卡中提供的名称所需的正确参数。或者如果不是我需要什么其他参数?

     

3)这是由于内存分配不当引起的未处理异常,还是有其他原因?

     

4)是否有其他方法可以访问辅助监视器的friendlyname?

1 个答案:

答案 0 :(得分:4)

<强>更新

我切换到使用The PhysicalMonitorAPI而不是GetMonitorInfo。我把原始解决方案与第一个结合起来。这会产生您期望的更合理的输出(例如“Dell UH2313”而不是“\。\ Display1”)。

从技术上讲,你应该分配监视器数组而不是使用硬编码数组 - 但我从未见过dwCount将被初始化为大于1的任何内容。

此程序在Visual Studio中编译得很好,但您需要与dxva2.lib链接以获取PhysicalMonitor APIs.

的定义
#include <Windows.h>
#include <PhysicalMonitorEnumerationAPI.h>
#include <string>
#include <iostream>
#include <stdio.h>

BOOL __stdcall MyMonitorEnumProc
(
_In_ HMONITOR hMonitor,
_In_ HDC      hdcMonitor,
_In_ LPRECT   lprcMonitor,
_In_ LPARAM   dwData
)
{
    DWORD dwCount = 0;
    std::wstring strName(L"Unknown monitor name");
    PHYSICAL_MONITOR monitors[100] = {};
    MONITORINFOEX info = {};
    info.cbSize = sizeof(info);

    if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&info))
    {
        strName = info.szDevice;
    }

    if (GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &dwCount) && (dwCount > 0) && (dwCount < ARRAYSIZE(monitors)))
    {
        if (GetPhysicalMonitorsFromHMONITOR(hMonitor, dwCount, monitors))
        {
            strName = monitors[0].szPhysicalMonitorDescription;

            DestroyPhysicalMonitors(dwCount, monitors);
        }
    }

    std::wcout << L"Monitor: " << strName << std::endl;

    return TRUE;
}

void printMonitorNames()
{
    EnumDisplayMonitors(NULL, NULL, MyMonitorEnumProc, NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
    printMonitorNames();
    return 0;
}

并且可以首先为主监视器调用MyMonitorEnumProc。接下来列举所有其他监视器。