2015-10-01 52 views
2

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

不过,我需要的时候,我们检查屏幕分辨率,如显示名称这里提到的名字显示:

首先我不知道从哪里我可以获得这个字符串。在阅读一点,我想这是该设备的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)有没有其他方法可以访问辅助监视器的友好名称?

回答

2

更新

我转向使用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将先被调用的主显示器。其他所有监视器都会在下一个枚举。

+0

输出是:'Monitor Name是:\\。\ DISPLAY1监视器名称是\\。\ DISPLAY2',而我需要设备专用名称。例如,当我连接辅助显示器时,在屏幕分辨率选项卡中,显示器名称是** TopFoison LCD **,因此我需要读取该字符串。我相信友好名称会从[这里]提到的内容返回(https://msdn.microsoft.com/en-us/library/windows/hardware/ff552837(v = vs.85).aspx)**对于打印机,指定“友好名称”;例如PCL/HP LaserJet中的“PCL/HP LaserJet”。** – annie1994

+0

@ annie1994 - 更新了我的答案。该程序现在使用物理监视器API来获取用户友好的监视器名称。与dxva2.lib链接。 – selbie