Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#wpf窗口此。在Win8上返回错误位置的顶部?_C#_Wpf_Windows 8_Screen Capture - Fatal编程技术网

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

C#wpf窗口此。在Win8上返回错误位置的顶部?,c#,wpf,windows-8,screen-capture,C#,Wpf,Windows 8,Screen Capture,这让我有点困惑。我们有一个c#/WPF屏幕捕获工具,它使用Graphics.CopyFromScreen捕获桌面的一部分 它可以在几十台不同的机器上正常工作,包括XP、Win7和至少一台Windows8虚拟机 我们遇到了一款带有Win8的Acer ZS600,我们看到了一种奇怪的效果,我想不出来 当你拍摄时,它会抓取一张大小正确但位置错误的图像。它向顶部和左侧偏移。不是固定数量的。当捕获窗口位于屏幕0,0位置时,这是正常的,但当您将捕获窗口移离原点时,偏移量会增加 我仔细阅读了代码,发现窗口位置

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

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

我们遇到了一款带有Win8的Acer ZS600,我们看到了一种奇怪的效果,我想不出来

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

我仔细阅读了代码,发现窗口位置(this.Top和this.Left)报告了错误的数字

更奇怪的是,我们曾在Acer Z5771上尝试过这一功能,除了使用Windows 7之外,它的硬件设置几乎相同。我们尝试过更新Zs600图形驱动程序,但没有效果

是否有人理解这一点,或建议修复或解决方法

编辑:我制作了一个简单的应用程序,在问题机器上显示效果。在我的开发机器上,它运行良好。请在此下载:

或下载编译版本:


编辑:这里有两个截图的捕获应用程序在使用的问题系统。(编辑-在该屏幕截图中,我用宽度和高度切换了x&y显示的数字,现在已在上传的代码中固定,请忽略此项)

这可能是因为OS
Dpi
设置设置高于100%

您可以创建一个助手方法,根据当前的OS 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));

这可能是因为OS
Dpi
设置设置高于100%

您可以创建一个助手方法,根据当前的OS 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));

你能试试固定号码吗?试试固定号码。捕获部分抓住屏幕的右侧部分。问题是wpf窗口给了我一个错误的位置。你可以创建另一个不可见的窗口作为你的参考,如果它是你的wpf的位置,让新窗口始终在左上角是静态的,并从中工作吗?我上传了一些示例代码。我很快会放一些屏幕截图。检查你的系统DPI。你能试试固定号码吗?试试固定号码。捕获部分抓住屏幕的右侧部分。问题是wpf窗口给了我一个错误的位置。你可以创建另一个不可见的窗口作为你的参考,如果它是你的wpf的位置,让新窗口始终在左上角是静态的,并从中工作吗?我上传了一些示例代码。我很快会放一些屏幕截图。检查您的系统DPI。我在哪里可以找到DPI设置?(我不熟悉windows 8)你可以在这里找到一些信息是的-DPI设置为125%。我不知道这个设置存在——我不知道DPI和屏幕分辨率之间有什么区别。谢谢。我找到了另一个解决办法。我可以使用var point=PointToScreen(new System.Windows.point(0,0)),而不是使用this.Left和this.Top;--如果DPI为100%,则给出相同的答案,但如果DPI为125%,则给出正确答案DPI设置在哪里?(我不熟悉windows 8)你可以在这里找到一些信息是的-DPI设置为125%。我不知道这个设置存在——我不知道DPI和屏幕分辨率之间有什么区别。谢谢。我找到了另一个解决办法。我可以使用var point=PointToScreen(new System.Windows.point(0,0)),而不是使用this.Left和this.Top;--如果DPI为100%,则给出相同的答案;如果DPI为125%,则给出正确答案