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

如何在WinForm中彻底关闭不同比例的DPI缩放?

彻底关闭WinForm DPI缩放的解决方案(.NET 4.5 Office插件场景)

以下是针对你的场景(.NET 4.5、Office插件、高缩放比例下控件重叠)的几种简单有效方法,可彻底关闭DPI缩放:

方法1:修改应用程序清单(推荐)

若之前修改清单无效,可能是配置格式错误。在项目的app.manifest文件中,找到<application>节点,添加DPI感知配置:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
  </windowsSettings>
</application>

如果没有app.manifest,右键项目→添加→新建项→选择「应用程序清单文件」后再添加上述代码。true/PM会让程序以原始尺寸运行,不触发系统或WinForm的DPI缩放。

方法2:代码层面强制设置DPI感知

若无法修改清单,可通过Windows API在窗体创建前强制关闭DPI感知:
首先声明API:

Imports System.Runtime.InteropServices

Public Class DpiHelper
    <DllImport("user32.dll", SetLastError:=True)>
    Private Shared Function SetProcessDpiAwareness(context As Integer) As Boolean
    End Function

    Public Shared Sub DisableDpiScaling()
        ' 设置进程为系统DPI感知,彻底关闭缩放
        SetProcessDpiAwareness(1)
    End Sub
End Class

然后在启动窗体前调用:

Dim frm As Form
Try
    DpiHelper.DisableDpiScaling()
    frm = New FrmCreator
    frm.ShowDialog()
Catch ex As Exception
    Log.Error(ex, "Error while showing creator form.")
End Try

参数说明:

  • 1:PROCESS_SYSTEM_DPI_AWARE,程序仅感知系统基础DPI,不会被缩放
  • 若无效可尝试0(PROCESS_DPI_UNAWARE),系统会按原始尺寸渲染程序

方法3:窗体级别的强制尺寸锁定

确保所有窗体AutoScaleMode = None、AutoSize = False,并在Load事件中强制锁定窗体及控件布局:

Private Sub FrmCreator_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 替换为你设计时的窗体尺寸
    Me.Size = New Size(800, 600)
    ' 触发停靠控件重新布局,避免重叠
    For Each ctrl As Control In Me.Controls
        If ctrl.Dock <> DockStyle.None Then
            ctrl.PerformLayout()
        End If
    Next
End Sub

关于.NET 4.8的补充

.NET 4.8优化了WinForm的DPI缩放逻辑,新增了更完善的每监视器DPI支持。若可以升级框架,只需将AutoScaleMode设为Dpi,并配合清单的true/PM配置,即可自动适配高DPI且避免控件重叠,无需额外代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:06:29