多显示器场景下适配不同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 2024-12-28 22:11  崔好好  阅读(214)  评论(0)    收藏  举报

导航