.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
相关产品推荐
相关产品推荐

