我需要获得当前显示分辨率的所有显示器连接到计算机。
我可以使用EnumDisplayDevicesA API成功地启用显示设备,但是由于未知的原因,我无法使用EnumDisplayDevicesA API获得设备\.\ display 2的当前显示分辨率。以下是代码:
displays = 0;
result = 1;
for (index = 0; result != 0; index++)
{
devices[index].cb = sizeof(DISPLAY_DEVICEA);
result = EnumDisplayDevicesA(NULL, index, &(devices[displays] ), 0);
if (result == 0)
{
break;
}
settings[index].dmSize = sizeof(DEVMODEA);
mode = 0;
// Collect the settings
while(EnumDisplaySettingsA(devices[index].DeviceName, mode, (DEVMODEA *)&(settings[displays] ) ) )
{
mode++;
};
// Read the current settings
result = EnumDisplaySettingsA(devices[index].DeviceName, ENUM_CURRENT_SETTINGS, (DEVMODEA *)&(settings[displays] ) );
if (result != 0)
{
displays++;
}
else
{
result = GetLastError();
printf("Error while readind display settings %d\n", result);
//Skip this device
result = 1;
}
}
请注意,此代码在某些计算机上工作完美,而在具有多个显卡的计算机上则失败。例如,它在带有IntelHDGraphicw630+ Nvidia M1200的膝上型计算机上失败,其中活动显示器是主膝上型显示器,以及通过HDMI或DP端口附加的外部显示)。更准确地说,在这些计算机上,我可以获得第一个显示设备(\\ display 1)的正确分辨率,但在第二个显示设备(\.\ display 2)上,返回的宽度和高度是0。
EnumDisplaySettingsA API只返回0,以及GetLastError API。
设备代表什么?它们是连接到单个视频卡上的监视器,还是仅仅是连接到任何视频卡上的监视器?
注意:使用EnumDisplayMonitors,我可以在EnumDisplaySettingsA失败时获得所有监视器的分辨率。
发布于 2020-02-14 15:52:14
(DEVMODEA*)&(设置显示器)
您使用强制转换的事实表明,settings
定义错误,而cast用于隐藏问题。例如,如果您声明了DEVMODEA *settings = malloc(count * sizeof(DEVMODEA))
,那么就不需要强制转换了。
您应该使用Microsoft推荐的Unicode函数。如果需要打印ANSI,则使用WideCharToMultiByte
将Unicode转换为ANSI。
此外,您正在下面的代码中覆盖settings[index]
:
结果= while(EnumDisplaySettingsA(devicesindex.DeviceName,(devicesindex.DeviceName,ENUM_CURRENT_SETTINGS,(DEVMODEA *)&(设置显示器) );
请注意,对EnumDisplaySettingsA
的第二个调用使用ENUM_CURRENT_SETTINGS
,此调用永远不会失败,并可能在您的循环中造成问题。它还将覆盖settings[displays]
的前一个值。
试试下面的代码,看看是否有区别。
int main()
{
DISPLAY_DEVICE device = { 0 };
device.cb = sizeof(DISPLAY_DEVICE);
for(int index = 0;; index++)
{
if(!EnumDisplayDevices(NULL, index, &device, EDD_GET_DEVICE_INTERFACE_NAME))
break;
#ifdef UNICODE
wprintf(L"%s\n", device.DeviceName);
#else
printf("%s\n", device.DeviceName);
#endif
DEVMODE devmode = { 0 };
devmode.dmSize = sizeof(DEVMODE);
for(int modes = 0;; modes++)
{
if(!EnumDisplaySettings(device.DeviceName, modes, &devmode))
break;
printf("%d %d %d\n",
devmode.dmPelsWidth,
devmode.dmPelsHeight,
devmode.dmDisplayFrequency);
}
}
return 0;
}
或读取每个监视器的当前分辨率。
int main()
{
int count = 0;
DISPLAY_DEVICE temp = { 0 };
temp.cb = sizeof(DISPLAY_DEVICE);
while(EnumDisplayDevices(NULL, count, &temp, EDD_GET_DEVICE_INTERFACE_NAME))
count++;
DEVMODE *settings = malloc(count * sizeof(DEVMODE));
DISPLAY_DEVICE *devices = malloc(count * sizeof(DISPLAY_DEVICE));
for (int index = 0; index < count; index++)
{
memset(&devices[index], 0, sizeof(DISPLAY_DEVICE));
memset(&settings[index], 0, sizeof(DEVMODE));
devices[index].cb = sizeof(DISPLAY_DEVICE);
settings[index].dmSize = sizeof(DEVMODE);
if(!EnumDisplayDevices(NULL, index, &devices[index], EDD_GET_DEVICE_INTERFACE_NAME))
break;
if(!EnumDisplaySettings(devices[index].DeviceName, ENUM_CURRENT_SETTINGS, &settings[index]))
break;
}
for(int index = 0; index < count; index++)
{
#ifdef UNICODE
wprintf(L"%s ", devices[index].DeviceName);
#else
printf("%s ", devices[index].DeviceName);
#endif
printf("%d %d %d\n",
settings[index].dmPelsWidth,
settings[index].dmPelsHeight,
settings[index].dmDisplayFrequency);
}
return 0;
}
https://stackoverflow.com/questions/60141542
复制相似问题