我在使用 winapi 检索监视器的名称时遇到了一些麻烦。根据 stackoverflow 上的其他条目,获取监视器名称的正确方法是:
EnumDisplayDevices(nullptr, 0, &oDisplayDevice, 0);
char lpszDeviceName[32];
memcpy(lpszDeviceName, oDisplayDevice.DeviceName, 32);
EnumDisplayDevices(lpszDeviceName, 0, &oDisplayDevice, 0);
char lpszMonitorName[128];
memcpy(lpszMonitorName, oDisplayDevice.DeviceString, 128);
但是,EnumDisplayDevices
第二次返回 FALSE
。第一次,DeviceName
是 \\DISPLAY1
并且 DeviceString
是 GPU 供应商。使用 MONITORINFOEX
结构给我的值与 DeviceName
相同。
明确地说,我正在寻找类似“Samsung blah blah”之类的内容,或者屏幕分辨率页面上控制面板中显示的内容。
最佳答案
这似乎为我返回了正确的数据:
#include <Windows.h>
#include <iostream>
#include <string>
int main()
{
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
int deviceIndex = 0;
while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
{
std::string deviceName = dd.DeviceName;
int monitorIndex = 0;
while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
{
std::cout << dd.DeviceName << ", " << dd.DeviceString << "\n";
++monitorIndex;
}
++deviceIndex;
}
return 0;
}
如果您正在为 UNICODE 编译,那么请改用它:
#include <Windows.h>
#include <iostream>
#include <string>
int main()
{
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
int deviceIndex = 0;
while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
{
std::wstring deviceName = dd.DeviceName;
int monitorIndex = 0;
while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
{
std::wcout << dd.DeviceName << L", " << dd.DeviceString << L"\n";
++monitorIndex;
}
++deviceIndex;
}
return 0;
}
这是一个输出示例:
\.\DISPLAY1\Monitor0, Dell U2410(DP)
\.\DISPLAY2\Monitor0, Dell 2407WFP-HC (Digital)
关于c++ - 获取监视器的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20060584/