我需要获取辅助监视器的设备名称。但是,当我只是尝试检索设备名称时,输出为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?
答案 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。接下来列举所有其他监视器。