多显示器场景下适配不同DPI的方案demo备忘
为了在多显示器和远程桌面场景下正确适配不同 DPI、分辨率和缩放比例,您可以遵循以下步骤和代码示例。
方案概述
- 启用 DPI 感知:确保应用程序对 DPI 感知。
- 获取显示器信息:遍历所有显示器,获取每个显示器的 DPI、分辨率和缩放比例。
- 响应 DPI 更改:处理 DPI 变化的消息,以便在用户更改显示设置时更新应用程序界面。
代码流程示例
以下是一个完整的示例,展示如何获取和处理多显示器的显示信息。
#include <windows.h>
#include <shellscalingapi.h>
#include <iostream>
// 启用 DPI 感知
void EnableDpiAwareness() {
SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);
}
// 回调函数,用于枚举显示器
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
MONITORINFOEX monitorInfo;
monitorInfo.cbSize = sizeof(MONITORINFOEX);
if (GetMonitorInfo(hMonitor, &monitorInfo)) {
UINT dpiX, dpiY;
if (GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK) {
std::wcout << L"Monitor: " << monitorInfo.szDevice << std::endl;
std::wcout << L"Resolution: " << (monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left)
<< L"x" << (monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top) << std::endl;
std::wcout << L"DPI: " << dpiX << L"x" << dpiY << std::endl;
}
}
return TRUE;
}
// 主函数
int main() {
EnableDpiAwareness();
// 枚举所有显示器
EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0);
return 0;
}
处理 DPI 变化
在 Windows 10 中,可以处理 WM_DPICHANGED
消息,以便在用户更改显示设置时更新应用程序:
case WM_DPICHANGED:
{
UINT dpi = HIWORD(wParam);
RECT* const prcNewWindow = (RECT*)lParam;
SetWindowPos(hwnd, NULL, prcNewWindow->left, prcNewWindow->top,
prcNewWindow->right - prcNewWindow->left,
prcNewWindow->bottom - prcNewWindow->top,
SWP_NOZORDER | SWP_NOACTIVATE);
// 更新界面布局
}
break;
注意事项
- 确保在应用程序清单中声明 DPI 感知。
- 测试应用程序在不同的显示设置和远程桌面场景下的表现。
- 使用
SetProcessDpiAwareness
需要链接Shcore.lib
,并在 Windows 8.1 或更高版本上运行。
通过这些步骤,您可以确保应用程序在多显示器和远程桌面环境中正确适配不同的显示设置。
Reference
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南