C#wpf窗口此。在Win8上返回错误位置的顶部?
这让我有点困惑。我们有一个c#/WPF屏幕捕获工具,它使用Graphics.CopyFromScreen捕获桌面的一部分 它可以在几十台不同的机器上正常工作,包括XP、Win7和至少一台Windows8虚拟机 我们遇到了一款带有Win8的Acer ZS600,我们看到了一种奇怪的效果,我想不出来 当你拍摄时,它会抓取一张大小正确但位置错误的图像。它向顶部和左侧偏移。不是固定数量的。当捕获窗口位于屏幕0,0位置时,这是正常的,但当您将捕获窗口移离原点时,偏移量会增加 我仔细阅读了代码,发现窗口位置(this.Top和this.Left)报告了错误的数字 更奇怪的是,我们曾在Acer Z5771上尝试过这一功能,除了使用Windows 7之外,它的硬件设置几乎相同。我们尝试过更新Zs600图形驱动程序,但没有效果 是否有人理解这一点,或建议修复或解决方法 编辑:我制作了一个简单的应用程序,在问题机器上显示效果。在我的开发机器上,它运行良好。请在此下载: 或下载编译版本: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位置时,这是正常的,但当您将捕获窗口移离原点时,偏移量会增加 我仔细阅读了代码,发现窗口位置
编辑:这里有两个截图的捕获应用程序在使用的问题系统。(编辑-在该屏幕截图中,我用宽度和高度切换了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%,则给出正确答案