gpt4 book ai didi

无法使用 EnumDisplaySettings 获取所有设备的显示分辨率

转载 作者:行者123 更新时间:2023-11-30 14:31:44 28 4
gpt4 key购买 nike

我需要获取连接到计算机的所有显示器的当前显示分辨​​率。

我可以使用 EnumDisplayDevicesA API 成功枚举显示设备,但由于未知原因,我无法获取设备的当前显示分辨​​率 \\.\DISPLAY2使用EnumDisplayDevicesA API。这是代码:

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;
}
}

请注意,此代码在某些计算机上可以完美运行,但在具有多个显卡的计算机上却会失败。例如,它在配备 Intel HD Graphicw 630 + Nvidia Quadro M1200 的笔记本电脑上失败,其中事件显示器是笔记本电脑的主显示器和通过 HDMI 或 DP 端口连接的外部显示器。更准确地说,在这些计算机上,我可以获得第一个显示设备 (\\.\DISPLAY1) 的正确分辨率,但在第二个显示设备 (\\.\DISPLAY2) 上,返回的宽度和高度为 0。

EnumDisplaySettingsA API 和 GetLastError API 一样仅返回 0。

设备代表什么?它们是连接到单个视频卡的显示器还是只是连接到任何视频卡的显示器?

注意:使用EnumDisplayMonitors,当EnumDisplaySettingsA失败时,我可以获得所有显示器的分辨率。

最佳答案

(DEVMODEA*)&(settings[displays])

您使用强制转换的事实表明 settings 定义不正确,强制转换用于隐藏问题。例如,如果您已声明 DEVMODEA *settings = malloc(count * sizeof(DEVMODEA)) 则不需要进行强制转换。

您应该按照 Microsoft 的建议简单地使用 Unicode 函数。如果您需要打印 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,此调用永远不会失败,并且可能会导致循环出现问题。它还会覆盖 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;
}

关于无法使用 EnumDisplaySettings 获取所有设备的显示分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60141542/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com