我有vb.net winform app AutoScaleMode = dpi AutoScale = false AutoSize = true
我在更改DPI设置后签字了。 我也尝试重新启动机器。
Using g As Graphics = form.CreateGraphics()
Dim dpiX As Single = g.DpiX
无论DPI设置如何,dpiX始终为96。谁知道我做错了什么?
答案 0 :(得分:3)
我找到了解决方案。我的应用程序的清单必须说它是dpiAware。 因为我试图检测高DPI并显示警告消息框而不是真的试图使我的应用程序dpi意识到,我不能这样做。 您可以从注册表获取dpi感知信息: HKEY_CURRENT_USER \控制面板\桌面 LogPixels。
如果您使用默认设置,则不会有密钥。更改DPI设置将创建一个。
答案 1 :(得分:0)
我遇到了这个问题并发现如果你覆盖表单的OnPaint(PaintEventArgs e)
方法,然后从参数'e'获得Graphics对象,即e.Graphics
那么DpiX和DpiY值这个Graphics对象是正确的。
答案 2 :(得分:0)
不幸的是,Windows处理DPI扩展的方式到处都是:
Using g As Graphics = form.CreateGraphics()
Dim dpiX As Single = g.DpiX
此代码仅在用户在设置自定义DPI时选择“使用Windows XP样式DPI缩放”时才有效。不知道在新版本的Windows(8.x和10)中是否可以使用该选项,或者是否已将其取出。
您最好的选择是阅读注册表:
Dim regUseDpiScaling As Integer
Try 'Use Try / Catch since the reg value may not exist if user using 96 DPI.
regUseDpiScaling = CInt(My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "UseDpiScaling", Nothing)) ' if this returns 1, it means users is using modern DPI scaling.
Catch ex As Exception
regUseDpiScaling = 0 ' 0 means no DPI scaling or XP DPI scaling
End Try
If Not (regUseDpiScaling = 0) Then
boolUsesModernDPIScaling = True 'Means you haven't clicked "Use Windows XP Style DPI Scaling" while setting DPI in your system.
Else
boolUsesModernDPIScaling = False
MsgBox("2")
End If
Dim regAppliedDPI As Integer
Try
regAppliedDPI = CInt(My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "AppliedDPI", Nothing))
Catch ex As Exception
regAppliedDPI = 96
End Try
DPIratioX = regAppliedDPI / 96
DPIratioY = regAppliedDPI / 96
我发现使用XP DPI缩放会导致不同的行为,所以让程序检测它是否正在被使用是好的。