1

我对此有点迷惑。我们有 ac#/WPF 屏幕捕获工具,它使用 Graphics.CopyFromScreen 抓取桌面的一部分。

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

我们遇到了一台装有 Win8 的 Acer ZS600,我们看到了一种我无法理解的奇怪效果。

当您捕获时,它会抓取正确大小但位置错误的图像。它向顶部和左侧偏移。不是固定数额。当捕获窗口位于屏幕 0,0 位置时很好,但是当您将捕获窗口从原点移开时,偏移量会增加。

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

更奇怪的是,我们在 Acer Z5771 上进行了尝试,除了使用 Windows 7 外,它几乎与硬件设置相同。我们尝试更新 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 的显示数字,现在已在上传的代码中修复,请忽略此)

4

1 回答 1

5

这可能是因为操作系统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));
于 2013-03-02T22:18:04.853 回答