You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP如何获取独立显示器上第二窗口的尺寸与缩放系数

解决方案

核心需求:获取次级窗口实际尺寸

AppWindow原生提供了直接读取窗口尺寸的属性,无需切换线程即可调用:

  • 只读客户区(无标题栏区域)尺寸:AppWindow.ClientSize,返回值单位为有效像素(逻辑像素)
  • 只读全窗口(包含标题栏)尺寸:AppWindow.Size,返回值单位为有效像素(逻辑像素)

代码示例:

// 次级窗口创建流程
AppWindow secondaryWindow = await AppWindow.TryCreateAsync();
Frame secondaryContent = new Frame();
secondaryContent.Navigate(typeof(YourSecondaryPage));
ElementCompositionPreview.SetAppWindowContent(secondaryWindow, secondaryContent);
await secondaryWindow.TryShowAsync();

// 直接读取尺寸
Size clientLogicalSize = secondaryWindow.ClientSize;
Size fullWindowLogicalSize = secondaryWindow.Size;

如果你需要窗口的物理像素尺寸,将有效像素尺寸乘以对应显示器的缩放系数即可。


获取次级窗口所在显示器的缩放系数及其他参数

核心注意:DisplayInformation.GetForCurrentView() 的返回值和调用线程所属的视图严格绑定,在主窗口线程调用只会返回主窗口对应显示器的参数,必须切换到次级窗口的调度上下文执行调用才能拿到正确值

方式1:通过DisplayInformation获取参数

通过次级窗口的DispatcherQueue调度到对应视图上下文执行查询:

await secondaryWindow.DispatcherQueue.EnqueueAsync(() =>
{
    DisplayInformation secondaryDisplayInfo = DisplayInformation.GetForCurrentView();
    // 缩放系数,比如250%对应ResolutionScale.Scale250Percent
    ResolutionScale scale = secondaryDisplayInfo.ResolutionScale;
    double scaleFactor = (int)scale / 100.0;
    // 显示器物理分辨率
    uint screenRawWidth = secondaryDisplayInfo.ScreenWidthInRawPixels;
    uint screenRawHeight = secondaryDisplayInfo.ScreenHeightInRawPixels;
    // 计算窗口物理像素尺寸
    double clientPhysicalWidth = clientLogicalSize.Width * scaleFactor;
    double clientPhysicalHeight = clientLogicalSize.Height * scaleFactor;
});

如果需要监听参数变化(比如窗口拖动到其他显示器、系统缩放系数修改),可以在上述上下文内订阅DisplayInformation.DpiChanged、DisplayInformation.DisplayContentsInvalidated事件实现自动更新。

方式2:通过DisplayMonitor直接获取显示器全量参数

AppWindow自带DisplayId属性,可以直接关联到对应显示器对象,无需切换线程:

DisplayMonitor monitor = DisplayMonitor.GetFromDisplayId(secondaryWindow.DisplayId);
// 显示器友好名称
string monitorName = monitor.DisplayName;
// 显示器物理尺寸(单位:英寸)
Size? monitorPhysicalSize = monitor.PhysicalSizeInInches;
// 显示器工作区偏移(单位:物理像素)
Point workAreaOffset = monitor.WorkAreaOffsetInRawPixels;
// 显示器原始DPI
float rawDpiX = monitor.RawDpiX;
float rawDpiY = monitor.RawDpiY;

内容的提问来源于stack exchange,提问作者Cristiano Ghersi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:04