我在使用 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
is \\DISPLAY1
and DeviceString
是 GPU 供应商。使用MONITORINFOEX
struct 给我的值与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,戴尔 U2410(DP)
\.\DISPLAY2\Monitor0,戴尔
2407WFP-HC(数字)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)