多显示器场景下适配不同DPI的方案demo备忘

为了在多显示器和远程桌面场景下正确适配不同 DPI、分辨率和缩放比例,您可以遵循以下步骤和代码示例。

方案概述

  1. 启用 DPI 感知:确保应用程序对 DPI 感知。
  2. 获取显示器信息:遍历所有显示器,获取每个显示器的 DPI、分辨率和缩放比例。
  3. 响应 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

https://learn.microsoft.com/zh-cn/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows

posted on   崔好好  阅读(56)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示