代码之家  ›  专栏  ›  技术社区  ›  Sugrue

C#wpf窗口这个。顶部在Win8上返回错误的位置?

  •  1
  • Sugrue  · 技术社区  · 11 年前

    我对此有点困惑。我们有一个c#/WPF屏幕捕获工具,可以使用Graphics.CopyFromScreen捕获桌面的一部分。

    它可以在数十台不同的机器上正常工作,包括XP、Win7和至少一台Windows8虚拟机。

    我们遇到了一款搭载Win8的Acer ZS600,我们看到了一种我无法理解的奇怪效果。

    当你拍摄时,它会捕捉到一张大小正确但位置错误的图像。它向顶部和左侧偏移。不是固定数额。当捕捉窗口位于屏幕0,0位置时,这是可以的,但当您将捕捉窗口从原点移开时,偏移量会增加。

    我查看了代码,发现窗口位置(this.Top和this.Left)报告的数字错误。

    更奇怪的是,我们在Acer Z5771上尝试过这一点,它几乎是相同的硬件设置,只是使用了Windows7。我们已经尝试更新Zs600图形驱动程序,但没有效果。

    有人理解这一点吗,或者建议解决方案或变通方法吗?

    编辑:我制作了一个简单的应用程序,在问题机器上显示效果。在我的开发机器上,它工作得很好。在此处下载: https://s3-eu-west-1.amazonaws.com/kdownload/Tools/CaptureTool_app.zip

    或者下载编译版本: https://s3-eu-west-1.amazonaws.com/kdownload/Tools/capturetest.exe

    编辑:这是问题系统上使用的捕获应用程序的两个屏幕截图。 https://s3-eu-west-1.amazonaws.com/kdownload/Tools/ProblemScreencap.png (编辑-在那张截图中,我将显示的x和y的数字与宽度和高度进行了切换,现在已在上传的代码中固定,请忽略这一点)

    1 回复  |  直到 11 年前
        1
  •  5
  •   sa_ddam213    11 年前

    可能是因为操作系统 Dpi 设置设置为高于100%。

    您可以制作一个辅助方法,根据当前操作系统的dpi进行检查并转换到正确的位置。

    有点像。

    public Point GetDpiSafeLocation(Point location)
    {
        PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
        if (source != null)
        {
            double dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
            double dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
            return new Point(location.X * 96.0 / dpiX, location.Y * 96.0 / dpiY);
        }
        return location;
    }
    

    用法:

     var point = GetDpiSafeLocation(new Point(Left, Top));