• win32


    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"
    ";
            break;
        }
            
        case DISPLAYCONFIG_TOPOLOGY_EXTEND: 
        {
            std::wcout << "EXTEND Mode" << L"
    ";
            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"
    ";
            std::wcout << L"sourceInfo id: " << p.sourceInfo.id << L"
    ";
            std::wcout << L"targetInfo adapterId: " << p.targetInfo.adapterId.HighPart <<" "<< p.targetInfo.adapterId.LowPart<<L"
    ";
            std::wcout << L"targetInfo id: " << p.targetInfo.id << L"
    ";
            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
    ", mi.szDevice);
    
        std::wcout << L"Name: " << getMonitorName(hMonitor) << L"
    ";
        return TRUE;
    }
    
    int main()
    {
        printf("
    
    EnumDisplayDevices
    
    
    ");
    
        DISPLAY_DEVICE dd;
        ZeroMemory(&dd, sizeof(dd));
        dd.cb = sizeof(dd);
        for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); i++)
        {
            wprintf(L"
    
    Device %d:", i);
            wprintf(L"
        DeviceName:   '%s'", dd.DeviceName);
            wprintf(L"
        DeviceString: '%s'", dd.DeviceString);
            wprintf(L"
        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"
        DeviceID: '%s'", dd2.DeviceID);
            wprintf(L"
        Monitor Name: '%s'", dd2.DeviceString);
        }
    
        printf("
    
    
    EnumDisplayMonitors
    
    
    ");
    
        EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
    
    
        return 0;
    }
  • 相关阅读:
    CTF-1-5题笔记
    无相劫指:Web安全之其他专题—第七天
    七伤拳:Web安全之文件包含漏洞专题—第六天
    CTF-输入密码查看flag -80
    工业级路由器采用的协议和功能
    PLC模拟量采集模块在工控领域的应用
    串口服务器的作用和工作原理是什么
    在PLC中开关量采集模块的作用
    4G DTU和4G工业路由器有哪些区别?
    应该怎么提升4G工业路由器的无线信号?
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14605572.html
Copyright © 2020-2023  润新知