如何在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
相关产品推荐
相关产品推荐

