System.Drawing.Graphics.DpiX始终返回96

时间:2013-11-18 21:09:54

标签: dpi

我有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。谁知道我做错了什么?

3 个答案:

答案 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缩放会导致不同的行为,所以让程序检测它是否正在被使用是好的。