win32 – QueryDisplayConfig的使用

QueryDisplayConfig函数检索关于所有显示设备的所有可能的显示路径,或视图,在当前设置的信息。

C++样本: (开箱即用)

代码列出了所有显示器的名称和拓展模式

#include <Windows.h>
#include <iostream>
#include <vector>
#include <cstdio>

std::wstring getMonitorName(HMONITOR monitor) {
    DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId;
    MONITORINFOEXW info;
    info.cbSize = sizeof(info);
    GetMonitorInfoW(monitor, &info);

    UINT32 requiredPaths, requiredModes;
    GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes);
    std::vector<DISPLAYCONFIG_PATH_INFO> paths(requiredPaths);
    std::vector<DISPLAYCONFIG_MODE_INFO> modes(requiredModes);
    QueryDisplayConfig(QDC_DATABASE_CURRENT, &requiredPaths, paths.data(), &requiredModes, modes.data(), &currentTopologyId);
    switch (currentTopologyId)
    {
    case DISPLAYCONFIG_TOPOLOGY_INTERNAL: 
        break;
    case DISPLAYCONFIG_TOPOLOGY_CLONE: 
    {
        std::wcout << "CLONE Mode" << L"\n";
        break;
    }

    case DISPLAYCONFIG_TOPOLOGY_EXTEND: 
    {
        std::wcout << "EXTEND Mode" << L"\n";
        break;
    }
    case DISPLAYCONFIG_TOPOLOGY_EXTERNAL: 
        break;
    default: break;
    }
    for (auto& p : paths) {
        DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName;
        sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
        sourceName.header.size = sizeof(sourceName);
        sourceName.header.adapterId = p.sourceInfo.adapterId;
        sourceName.header.id = p.sourceInfo.id;
        std::wcout << L"sourceInfo adapterId: " << p.sourceInfo.adapterId.HighPart <<" "<< p.sourceInfo.adapterId.LowPart<<L"\n";
        std::wcout << L"sourceInfo id: " << p.sourceInfo.id << L"\n";
        std::wcout << L"targetInfo adapterId: " << p.targetInfo.adapterId.HighPart <<" "<< p.targetInfo.adapterId.LowPart<<L"\n";
        std::wcout << L"targetInfo id: " << p.targetInfo.id << L"\n";
        DisplayConfigGetDeviceInfo(&sourceName.header);
        if (wcscmp(info.szDevice, sourceName.viewGdiDeviceName) == 0) {
            DISPLAYCONFIG_TARGET_DEVICE_NAME name;
            name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
            name.header.size = sizeof(name);
            name.header.adapterId = p.sourceInfo.adapterId;
            name.header.id = p.targetInfo.id;
            DisplayConfigGetDeviceInfo(&name.header);
            return std::wstring(name.monitorFriendlyDeviceName);
        }
    }
    return L"";
}


BOOL CALLBACK MyInfoEnumProc(
    HMONITOR hMonitor,
    HDC hdcMonitor,
    LPRECT lprcMonitor,
    LPARAM dwData
)
{
    MONITORINFOEX mi;
    ZeroMemory(&mi, sizeof(mi));
    mi.cbSize = sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);
    wprintf(L"DisplayDevice: %s\n", mi.szDevice);

    std::wcout << L"Name: " << getMonitorName(hMonitor) << L"\n";
    return TRUE;
}

int main()
{
    printf("\n\nEnumDisplayDevices\n\n\n");

    DISPLAY_DEVICE dd;
    ZeroMemory(&dd, sizeof(dd));
    dd.cb = sizeof(dd);
    for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); i++)
    {
        wprintf(L"\n\nDevice %d:", i);
        wprintf(L"\n    DeviceName:   '%s'", dd.DeviceName);
        wprintf(L"\n    DeviceString: '%s'", dd.DeviceString);
        wprintf(L"\n    StateFlags:   %s%s%s%s%s",
            ((dd.StateFlags &
                DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ?
                L"desktop " : L""),
                ((dd.StateFlags &
                    DISPLAY_DEVICE_PRIMARY_DEVICE) ?
                    L"primary " : L""),
                    ((dd.StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE) ?
                        L"vga " : L""),
                        ((dd.StateFlags &
                            DISPLAY_DEVICE_MULTI_DRIVER) ?
                            L"multi " : L""),
                            ((dd.StateFlags &
                                DISPLAY_DEVICE_MIRRORING_DRIVER) ?
                                L"mirror " : L""));

        // Get more info about the device
        DISPLAY_DEVICE dd2;
        ZeroMemory(&dd2, sizeof(dd2));
        dd2.cb = sizeof(dd2);
        EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0);
        wprintf(L"\n    DeviceID: '%s'", dd2.DeviceID);
        wprintf(L"\n    Monitor Name: '%s'", dd2.DeviceString);
    }

    printf("\n\n\nEnumDisplayMonitors\n\n\n");

    EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);


    return 0;
}

 

原文链接: https://www.cnblogs.com/strive-sun/p/14605572.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    win32 - QueryDisplayConfig的使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404635

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:39
下一篇 2023年4月25日 下午4:39

相关推荐