行业知识
监视器屏幕操作(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;} ��
上一篇:散文标题怎么写?
最新文章
- 怎么删excel服务器?
- 极域课堂管理系统,教育数字化转型的领航者,高效课堂管理必备工具!
- 网站怎么创建流程?
- 鑫威服务器怎么样?
- npm报错:request to https://registry.npm.taobao.org failed, reason certificate has expired
- 发邮箱服务器异常怎么解决?
- 揭秘PHP防伪系统核心源码,筑牢网络安全防线!
- 创意自制盆栽盆教程,打造独特植物小天地
- 英语脸怎么读啊?
- vue-element-admin - 超详细克隆并运行项目教程,完美解决 git clone 克隆项目失败、npm install 装包报错失败、项目运行后打开是英文的汉化等问题(新手小白一看就懂)