使用DesktopDPIOverride时,PointToScreen错误

本文关键字:PointToScreen 错误 DesktopDPIOverride 使用 | 更新日期: 2023-09-27 18:11:11

Control Panel'Appearance and Personalization'Display的"更改所有项目的大小"滑块设置为较大(这会更改此注册表项:HKEY_CURRENT_USER'Control Panel'Desktop'DesktopDPIOverride)导致Control.PointToScreen()方法计算错误。这可以在Windows窗体中使用以下Class1来复制:

public class Class1 : Control
{
  protected override void OnPaint(PaintEventArgs e)
  {
    base.OnPaint(e);
    Draw(e.ClipRectangle, e.Graphics);
  }
  private void Draw(Rectangle rect, Graphics graphics)
  {
    Pen pen = new Pen(Color.Red);
    pen.Width = 2;
    graphics.DrawRectangle(pen, rect);
  }
  protected override void OnMouseDown(MouseEventArgs e)
  {
    base.OnMouseDown(e);
    Point p = this.PointToScreen(new Point(0, 0));
    ControlPaint.DrawReversibleFrame(new Rectangle(p, new Size(e.X, e.Y)), Color.Yellow, FrameStyle.Dashed);
  }
  protected override void OnMouseUp(MouseEventArgs e)
  {
    base.OnMouseUp(e);
    this.Invalidate();
  }
}

在WinForm中使用此控件并单击它可以正常工作。现在将"change size of all items"更改为"bigger"并再次运行代码—代码不再按预期运行,PointToScreen方法返回了一个错误的值(0,0)。

有人知道如何解决这个问题吗?多谢。

使用DesktopDPIOverride时,PointToScreen错误

听起来你需要让它具有DPI意识。你可以这样做

[DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
static void Main()
{
    SetProcessDPIAware();
}