(DEVMODEA*)&(settings[displays])
Тот факт, что вы используете приведение, предполагает, что settings
определен неправильно, и приведение используется, чтобы скрыть проблему. Например, если вы объявили DEVMODEA *settings = malloc(count * sizeof(DEVMODEA))
, приведение не требуется.
Вы должны просто использовать функции Unicode в соответствии с рекомендациями Microsoft. Если вам нужно распечатать ANSI, используйте WideCharToMultiByte
для преобразования Unicode в ANSI.
Кроме того, вы перезаписываете settings[index]
в приведенном ниже коде:
while(EnumDisplaySettingsA(devices[index].DeviceName, mode, (DEVMODEA *)&(settings[displays] ) ) )
mode++;
result = EnumDisplaySettingsA(devices[index].DeviceName, ENUM_CURRENT_SETTINGS, (DEVMODEA *)&(settings[displays] ) );
Обратите внимание, что при втором вызове EnumDisplaySettingsA
используется ENUM_CURRENT_SETTINGS
, этот вызов никогда не будет неудачным и может вызвать проблемы в вашем l oop. Также будет перезаписано предыдущее значение для 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;
}