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

WPF极简应用主窗口无法占据最后显示器右侧半屏问题排查

问题分析与修复

你的代码主要存在三个核心问题:

1. DPI单位不匹配

WPF使用与设备无关的单位(1单位 = 1/96英寸),而System.Windows.Forms.Screen返回的是物理像素值,直接混用会导致高DPI显示器下尺寸计算完全错误,比如窗口过宽/过窄。

2. 多屏位置计算逻辑错误

你通过所有屏幕宽度总和计算窗口Left的方式不严谨:如果多屏不是从左到右连续排列,比如副屏在主屏左侧,这个计算会完全失效。正确的做法是直接取最后一个屏幕的左边界坐标,而非依赖宽度总和。

3. 单屏场景下的实际显示偏差

单屏时你的理论计算逻辑没问题,但因为DPI不匹配的底层问题,实际运行时会出现窗口位置偏移、尺寸不符合预期的情况。


修复后的代码

using System;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Media;

namespace Line
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            
            // 获取所有屏幕,取最后一个
            Screen lastScreen = Screen.AllScreens.Last();
            var screenBounds = lastScreen.Bounds;

            // 获取当前窗口的DPI缩放比例,转换像素到WPF单位
            var source = PresentationSource.FromVisual(this);
            if (source?.CompositionTarget == null) return;
            double dpiScaleX = source.CompositionTarget.TransformToDevice.M11;
            double dpiScaleY = source.CompositionTarget.TransformToDevice.M22;

            // 计算最后一个屏幕右半区的WPF单位坐标和尺寸
            double screenLeftInWpf = screenBounds.Left / dpiScaleX;
            double screenWidthInWpf = screenBounds.Width / dpiScaleX;
            double screenHeightInWpf = screenBounds.Height / dpiScaleY;

            // 设置窗口位置和尺寸
            Left = screenLeftInWpf + screenWidthInWpf / 2;
            Width = screenWidthInWpf / 2;
            Top = screenBounds.Top / dpiScaleY;
            Height = screenHeightInWpf;

            // 确保窗口处于正常状态,避免影响尺寸设置
            WindowState = WindowState.Normal;
        }
    }
}

额外说明

  • 如果需要避开任务栏,只占系统工作区,把screenBounds = lastScreen.Bounds改成screenBounds = lastScreen.WorkingArea即可。
  • 新增的DPI转换逻辑能适配各种高DPI显示器,彻底解决窗口尺寸异常的问题。
  • 直接使用最后一个屏幕的Left坐标,无论多屏如何排列,都能准确定位到最后一个屏幕的右半区。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:30