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

.NET Framework 4.7.2 VB WinForms中DpiChanged事件未触发求助

VB WinForms DpiChanged事件未触发的解决方法

问题描述

在VB WinForms应用中配置了PerMonitorV2 DPI感知,但DpiChanged事件始终无法触发,相同配置的C#项目可正常触发该事件。

关键排查点及解决方案

1. 修复App.config结构缺失

你的VB项目App.config缺少外层<configuration>节点,导致DPI感知配置未被系统正确加载。C#项目的配置包含在<configuration>节点内,而VB项目直接放置<System.Windows.Forms.ApplicationConfigurationSection>是无效的。

修正后的VB App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>

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

2. 完善App.manifest配置

除Windows 10兼容性声明外,建议添加DPI感知的直接声明,确保系统正确识别应用的DPI模式:

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

将这段代码添加到App.manifest的<assembly>节点内,与现有<compatibility>节点同级。

3. 手动注册事件(备选方案)

若使用Handles MyBase.DpiChanged仍不生效,可在窗体构造函数中手动注册事件:

Public Class Form1
    Public Sub New()
        InitializeComponent()
        AddHandler Me.DpiChanged, AddressOf Form1_DpiChanged
    End Sub

    Private Sub Form1_DpiChanged(sender As Object, e As DpiChangedEventArgs)
        MsgBox("DpiChanged!!!!!!", MsgBoxStyle.YesNo Or MsgBoxStyle.Exclamation, "title")
    End Sub
End Class

4. 验证项目基础设置

  • 打开VB项目属性,确认应用程序选项卡下的目标框架为.NET Framework 4.7.2
  • 检查调试选项卡,确保未勾选禁用高DPI缩放

验证步骤

修改配置后重新生成项目,将窗体拖至不同DPI的显示器,或调整系统缩放比例,观察DpiChanged事件是否触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:53:17