C# CreateGraphics()返回错误的Dpi

C# CreateGraphics()返回错误的Dpi,c#,winforms,C#,Winforms,我有一些WinForms应用程序,它们在一些Windows更新之后开始表现出奇怪的行为。 因此,我将字体比例设置设置为125%(120 Dpi)。之后,应用程序开始缩短文本。经过调查,我找到了原因,方法this.CreateGraphics()返回Graphics对象,其中DpiX/DpiY==96,即使在OnPaint()e.Graphics中有DpiX/DpiY==120。怎么可能呢 p、 如果我在OnPaint()中执行Graphics.FromHwnd,它仍然返回96 Dpi p、 s2

我有一些WinForms应用程序,它们在一些Windows更新之后开始表现出奇怪的行为。 因此,我将字体比例设置设置为125%(120 Dpi)。之后,应用程序开始缩短文本。经过调查,我找到了原因,方法
this.CreateGraphics()
返回
Graphics
对象,其中
DpiX/DpiY==96
,即使在
OnPaint()
e.Graphics中有
DpiX/DpiY==120
。怎么可能呢

p、 如果我在
OnPaint()
中执行
Graphics.FromHwnd
,它仍然返回96 Dpi

p、 s2。Dpi虚拟化已禁用

更新

经过进一步的调查,我能够在一个简单的应用程序中重现这种行为。 默认情况下,应用程序正在使用Dpi虚拟化运行(如果清单文件中未设置任何内容,并且未调用
setProcessDPIaaware

为了搞乱表单,应在表单创建后调用Dpi
SetProcessDPIAware
。之后会发生两件奇怪的事情:

  • Form.OnPaint
    方法将具有不同的e.Graphics.DpiX in取决于控件的焦点,例如,如果正在调整窗体的大小,则调用
    OnPaint
    ,并且DpiX==96,如果在任何按钮上移动鼠标,则调用
    OnPaint
    ,DpiX==120
  • UserControl的
    OnPaint
    始终具有DpiX==120,但
    this.CreateGraphics()
    返回DpiX==96
  • 我仍然不明白为什么不同的组件具有不同的Dpi


    我认为设置字体比例不会改变您的dpi…达到96是很正常的。请务必声明您的应用。@HansPassant不是,它不正常。直到最后一次,它总是得到正确的Dpi。启用Dpi虚拟化时,96是可以的,但禁用Dpi虚拟化时,它应该返回正确的数字。我不反对,但从问题中可以看出,您没有注意到这一点。获得96和120,嗯,非常的索赔通常需要非常的证据。所以你似乎没有正确地申报。在创建任何窗口之前,必须调用SetProcessDPIAware()。只要做对了,就喜欢这份清单。