小工具知识网

当前位置: 首页 > 行业知识 > 监视器屏幕操作(Win32, C++)

行业知识

监视器屏幕操作(Win32, C++)

2026-10-31 15:54:31 来源:互联网转载

CDisplayUtils.h

#pragma once#include #include #include #include #ifdef _UNICODEusing _tstring = std::wstring;#elseusing _tstring = std::string;#endiftypedef struct _MONITOR_DESC_INFO{    HMONITOR hMonitor;    RECT rect;    bool bPrimary;    _tstring strDevice;    _MONITOR_DESC_INFO() :hMonitor(NULL), rect{ 0 }, bPrimary(false) {}}MONITOR_DESC_INFO;typedef struct _DISPLAY_MODE_INFO{    DWORD dmPelsWidth;    DWORD dmPelsHeight;    DWORD dmDisplayFrequency;    _DISPLAY_MODE_INFO() :dmPelsWidth(0), dmPelsHeight(0), dmDisplayFrequency(0) {}}DISPLAY_MODE_INFO;enum DisplayOrientation{    DoDefault = DMDO_DEFAULT,    Do90 = DMDO_90,    Do180 = DMDO_180,    Do270 = DMDO_270,};class CDisplayUtils{public:    //    // @brief: 获取显示监视器信息    // @param: void                             无    // @ret: std::vector     显示监视器信息列表    static std::vector GetDisplayMonitorInfos();    //    // @brief: 获取主显示监视器信息    // @param: void                             无    // @ret: MONITOR_DESC_INFO                  显示监视器信息    static MONITOR_DESC_INFO GetPrimaryDisplayMonitorInfo();    //    // @brief: 获取显示监视器信息    // @param: iDevNum                          显示设备索引(从0开始)    // @ret: std::vector     显示监视器显示模式列表    static std::vector GetDisplayMode(DWORD iDevNum = 0);    //    // @brief: 获取主显示监视器信息    // @param: iDevNum                          显示设备索引(从0开始)    // @ret: std::vector     显示监视器显示模式列表    static std::vector GetPrimaryDisplayMode();    //    // @brief: 获取主显示监视器索引    // @param: void                             无    // @ret: DWORD                              主显示监视器索引    static DWORD GetPrimaryMonitorIndex();    //    // @brief: 获取当前活动屏幕宽高    // @param: nW                               屏幕宽度    // @param: nH                               屏幕高度    // @ret: bool                               操作结果    static bool GetCurrentSize(DWORD& nW, DWORD& nH);    //    // @brief: 设置当前活动屏幕宽高    // @param: nW                               屏幕宽度    // @param: nH                               屏幕高度    // @ret: bool                               操作结果    static bool SetCurrentSize(DWORD nW, DWORD nH);    //    // @brief: 获取当前活动屏幕旋转方向    // @param: nOri                             屏幕旋转方向    // @ret: bool                               操作结果    static bool GetCurrentOrientation(DisplayOrientation& nOri);    //    // @brief: 设置当前活动屏幕旋转方向    // @param: nOri                             屏幕旋转方向    // @ret: bool                               操作结果    static bool SetCurrentOrientation(DisplayOrientation nOri);    //    // @brief: 设置当前活动屏幕自动旋转    // @param: bEnable                          是否启用自动旋转    // @ret: bool                               操作结果    static bool SetCurrentAutoRotation(bool bEnable = false);    //    // @brief: 获取当前活动屏幕自动旋转    // @param: bEnable                          是否启用自动旋转    // @ret: bool                               操作结果    static bool GetCurrentAutoRotation(bool& bEnable);    //    // @brief: 设置当前活动屏幕旋转横向    // @param: bFlipped                         是否翻转    // @ret: bool                               操作结果    static bool SetCurrentLandscape(bool bFlipped = false);    //    // @brief: 设置当前活动屏幕旋转纵向    // @param: bFlipped                         是否翻转    // @ret: bool                               操作结果    static bool SetCurrentPortrait(bool bFlipped = false);private:    //    // @brief: 检查当前活动屏幕是否为横屏    // @param: nW                               屏幕宽度    // @param: nH                               屏幕高度    // @param: nOri                             屏幕旋转方向    // @ret: bool                               操作结果    static bool IsCurrentLandscape(DWORD nW, DWORD nH, DWORD nOri);};

CDisplayUtils.cpp

#include "CDisplayUtils.h"#pragma warning(disable:4100)#pragma comment(lib, "Advapi32.lib")#define SCREEN_AUTOROTATION     R"(SOFTWARE\Microsoft\Windows\CurrentVersion\AutoRotation)"#define HKLM                    HKEY_LOCAL_MACHINEstd::vector CDisplayUtils::GetDisplayMonitorInfos(){    std::vector vMonitorInfos;    if (!::EnumDisplayMonitors(NULL, NULL, [](HMONITOR hMonitor,        HDC hDC,        LPRECT lpRect,        LPARAM lparam) -> BOOL {            MONITORINFOEX monitorInfo;            monitorInfo.cbSize = sizeof(MONITORINFOEX);            GetMonitorInfo(hMonitor, &monitorInfo);            MONITOR_DESC_INFO info;            info.hMonitor = hMonitor;            info.rect = *lpRect;            info.bPrimary = false;            info.strDevice = monitorInfo.szDevice;            if (0 == info.rect.left && 0 == info.rect.top)            {                info.bPrimary = true;            }            std::vector* pInfos = (std::vector*)lparam;            pInfos->push_back(info);            return TRUE;        }, (LPARAM)&vMonitorInfos))    {    }    return vMonitorInfos;}MONITOR_DESC_INFO CDisplayUtils::GetPrimaryDisplayMonitorInfo(){    std::vector vInfos = GetDisplayMonitorInfos();    MONITOR_DESC_INFO emptyInfo;    for (size_t i = 0; i  nH && (DMDO_DEFAULT == nOri || DMDO_180 == nOri))    {        return true;    }    if (nW = dwH)            {                dm.dmPelsWidth = dwH;                dm.dmPelsHeight = dwW;            }            dm.dmDisplayOrientation = bFlipped ? DMDO_270 : DMDO_90;        }        else        {            if (dwW >= dwH)            {                dm.dmPelsWidth = dwH;                dm.dmPelsHeight = dwW;            }            dm.dmDisplayOrientation = bFlipped ? DMDO_180 : DMDO_DEFAULT;        }        long lRet = ::ChangeDisplaySettings(&dm, 0);        if (DISP_CHANGE_SUCCESSFUL == lRet)        {            return true;        }    }    return false;}

main.cpp

#include #include #include "Win32Utils/CTimeUtils.h"#include "Win32Utils/CProcessUtils.h"#include "Win32Utils/CDisplayUtils.h"int _tmain(int argc, LPCTSTR argv[]){    ::setlocale(LC_ALL, "");    MONITOR_DESC_INFO info = CDisplayUtils::GetPrimaryDisplayMonitorInfo();    std::vector monitorDesc = CDisplayUtils::GetDisplayMonitorInfos();    std::vector displayMode = CDisplayUtils::GetPrimaryDisplayMode();    return 0;}

��

 

上一篇:散文标题怎么写?

下一篇:微信快手快速吸引关注与点赞秘籍,轻松提升人气秘籍大揭秘!