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 显示的数字与宽度和高度进行了切换,现在已在上传的代码中修复,请忽略此)
这可能是因为操作系统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)
| 归档时间: |
|
| 查看次数: |
1656 次 |
| 最近记录: |