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

调整显示器缩放后WinForm被任务栏遮挡的问题求助

WinForm缩放后尺寸异常:被任务栏遮挡且顶部截断

基础信息

  • 组件类型:Outlook加载项调用的WinForm
  • 目标框架:.NET Framework 4.8
  • 显示器参数:1920x1080分辨率,150%缩放比例

问题现象

WinForm可根据显示器参数完成缩放,但缩放后表单尺寸过大,出现两个问题:

  • 部分区域被任务栏遮挡
  • 表单顶部被截断
    (注:原提问附150%缩放异常图、100%缩放正常图)

已尝试的无效方案

  • 切换多种缩放模式(无、字体、DPI),均未解决
  • 开启AutoScroll无效,表单判定自身尺寸足够
  • 设置最大/最小尺寸、启用AutoSize无效果
  • 临时方案:缩小WinForm强制显示滚动条,但不认可该方案

更新补充

  • 参考DPI感知相关方案未解决问题
  • 尝试添加配置项无效果:
<System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
  • 因是VSTO Outlook加载项,无Program.cs,将OnStartup代码放在AddIn.cs中,编译通过但未实现正确缩放

解决方案

1. 强制设置进程DPI感知(适配VSTO场景)

由于VSTO加载项运行在Outlook进程中,单独修改WinForm配置不生效,需在AddIn启动时通过代码强制设置DPI感知:

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
private static extern bool SetProcessDpiAwarenessContext(int dpiFlag);

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    // 设置为每显示器V2感知(对应DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)
    SetProcessDpiAwarenessContext(-4);
}

2. 手动适配工作区尺寸

在WinForm的Load事件中,基于当前屏幕工作区(排除任务栏)调整表单尺寸和位置:

private void YourForm_Load(object sender, EventArgs e)
{
    // 获取当前屏幕的可用工作区(不含任务栏)
    Rectangle workingArea = Screen.FromHandle(this.Handle).WorkingArea;
    // 计算当前DPI缩放比例
    float dpiScale = this.CurrentAutoScaleDimensions.Width / 96f;

    // 转换为WinForm设计时的尺寸(反向缩放)
    int maxFormWidth = (int)(workingArea.Width / dpiScale);
    int maxFormHeight = (int)(workingArea.Height / dpiScale);

    // 限制表单最大尺寸不超过工作区
    this.MaximumSize = new Size(maxFormWidth, maxFormHeight);
    // 超出则自动缩小
    if (this.Width > maxFormWidth) this.Width = maxFormWidth;
    if (this.Height > maxFormHeight) this.Height = maxFormHeight;

    // 居中显示(可选)
    this.Location = new Point(
        workingArea.Left + (workingArea.Width - (int)(this.Width * dpiScale)) / 2,
        workingArea.Top + (workingArea.Height - (int)(this.Height * dpiScale)) / 2
    );
}

3. 配置WinForm高DPI属性

确保WinForm的自动缩放模式设置为DPI:

public YourForm()
{
    InitializeComponent();
    this.AutoScaleMode = AutoScaleMode.Dpi;
}

4. 配置Outlook进程的DPI感知(备选)

若代码设置无效,可在Outlook安装目录创建OUTLOOK.EXE.config文件,添加以下内容:

<configuration>
  <System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
  </System.Windows.Forms.ApplicationConfigurationSection>
</configuration>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:37:19