Windows下获取屏幕坐标及分辨率

#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>

int main(int argc, char** argv)
{
    std::vector<RECT> vecScreenList;
    DISPLAY_DEVICE stDispDev = { 0 };
    BOOL bRet = FALSE;
    int nDevNum = 0;
    int nScreenCount = 0;
    printf("┌──┬─────────┬─────────────────┬──────┬────┬─────┬───────────────────────────────────────────────────┐\n");
    printf("│%-4s│ %-17s│ %-33s│ %s │ %-7s│ %-9s│ %-101s│\n",
        "Num", "DeviceName", "DeviceString", "StateFlags", "Active", "DeviceID", "DeviceKey");
    while (true)
    {
        memset(&stDispDev, 0, sizeof(DISPLAY_DEVICE));
        stDispDev.cb = sizeof(DISPLAY_DEVICE);
        bRet = EnumDisplayDevices(NULL, nDevNum, &stDispDev, EDD_GET_DEVICE_INTERFACE_NAME);
        if (bRet == FALSE)
        {
            break;
        }
        printf("├──┼─────────┼─────────────────┼──────┼────┼─────┼───────────────────────────────────────────────────┤\n");
        printf("│%-4d│ %-17s│ %-33s│ 0x%08x │ %-7s│ %-9s│ %-101s│\n",
            nDevNum, stDispDev.DeviceName, stDispDev.DeviceString, stDispDev.StateFlags,
            ((DISPLAY_DEVICE_ACTIVE & stDispDev.StateFlags) ? "Yes" : "No"),
            stDispDev.DeviceID, stDispDev.DeviceKey);
        if (DISPLAY_DEVICE_ACTIVE & stDispDev.StateFlags)
        {
            DEVMODE stDevMode = { 0 };
            stDevMode.dmSize = sizeof(DEVMODE);
            bRet = EnumDisplaySettings(stDispDev.DeviceName, ENUM_CURRENT_SETTINGS, &stDevMode);
            if (bRet)
            {
                RECT rect = { 0 };
                rect.left = stDevMode.dmPosition.x;
                rect.top = stDevMode.dmPosition.y;
                rect.right = stDevMode.dmPosition.x + stDevMode.dmPelsWidth;
                rect.bottom = stDevMode.dmPosition.y + stDevMode.dmPelsHeight;
                vecScreenList.push_back(rect);
            }
        }
        nDevNum++;
    }
    printf("└──┴─────────┴─────────────────┴──────┴────┴─────┴───────────────────────────────────────────────────┘\n");
    auto lamda = [](RECT a, RECT b)
    {
        if (a.left < b.left)
        {
            return true;
        }
        else if (a.top < b.top)
        {
            return true;
        }
        else
        {
            return false;
        }
    };
    // 排序
    std::sort(vecScreenList.begin(), vecScreenList.end(), lamda);

    printf("\n\n┌────┬──────┬───────────┬───┐\n");
    printf("│%s│ %-11s│ %-20s │ %-4s │\n", "屏幕编号", "分辨率", "坐标", "主屏");
    nScreenCount = 0;
    for (auto& itr : vecScreenList)
    {
        printf("├────┼──────┼───────────┼───┤\n");
        printf("│%-8d│ %-4dx%-4d  │ %-4d,%-4d,%-4d,%-4d  │ %-4s │\n", ++nScreenCount,
            itr.right - itr.left, itr.bottom - itr.top, itr.left, itr.top, itr.right, itr.bottom,
            (((itr.left == 0) && (itr.top == 0)) ? "是" : "否"));
    }
    printf("└────┴──────┴───────────┴───┘\n");
    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值