C# wpf 窗口 this.Top 在 Win8 上返回错误位置?

Sug*_*rue 1 c# wpf screen-capture windows-8

我对此有点困惑。我们有 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 显示的数字与宽度和高度进行了切换,现在已在上传的代码中修复,请忽略此)

sa_*_*213 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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

 var point = GetDpiSafeLocation(new Point(Left, Top));
Run Code Online (Sandbox Code Playgroud)