2012-09-20 34 views
3

我有一个WPF应用程序,其中我试图抓取WindowsFormsHost控件的屏幕抓取。为此,我正在做一个Graphics.CopyFromScreen。在我们测试过的大多数盒子上都是完美的,但是我们有一台机器没有抓住正确的尺寸值。由WPF给出的宽度和高度与控件的实际宽度和高度不匹配。当侦听时,不正确的值也显示为控件的ActualWidth和ActualHeight。更进一步,当我窥探主窗口(最大化)时,我得到了1550的ActualWidth和840的ActualHeight,但是我的屏幕分辨率是1920x1080。我会理解像边框,边距等几个像素,但要让WPF告诉我,我最大化的窗口宽度比实际屏幕短370像素,这是没有意义的。谁能解释这种行为?WPF给出不正确的大小值

下面是用来捕获控制的图像的代码:

public static Bitmap CreateBitmapFromVisual(this FrameworkElement target) 
{ 
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target); 
    if (bounds.Width == 0 && bounds.Height == 0) 
     return null; 

    System.Windows.Point p0 = target.PointToScreen(bounds.TopLeft); 
    System.Drawing.Point p1 = new System.Drawing.Point((int) p0.X, (int) p0.Y); 
    Bitmap image = new Bitmap((int)bounds.Width, (int)bounds.Height); 
    Graphics imgGraphics = Graphics.FromImage(image); 
    imgGraphics.CopyFromScreen(p1.X, p1.Y, 0, 0, new System.Drawing.Size((int) bounds.Width, (int) bounds.Height)); 
    return image; 
} 

这里是为了更好地描述一下我说的是图像:

enter image description here

由于你可以看到,snoop在说WindowsFormsHost的实际宽度和实际高度是486x336。我记录的任何调试信息都说同样的事情。但是,当我将“打印屏幕”和剪裁到油漆中的控件时,实际尺寸为608x423,差异很大。

作为进一步的更新,它看起来像wpf给出的宽度大约是实际宽度的80%。对于控制和窗口都是如此。

+2

ActualHeight和ActualWidth属性不是以像素为单位的,它们是独立于设备的单元。此外,ActualHeight和ActualWidth是否比您期望的要大或小? –

+0

更小。与上面问题中给出的主窗口示例一样,主窗口显示1550为ActualWidth,当宽度应该大一些时 – flamebaud

+0

您可以发布您的代码,以便我可以运行它并查看是否得到相同的结果? –

回答

4

你看过你的显示器的DPI设置吗?

要做到这一点转到控制面板 - 显示并选择设置自定义文字大小(DPI)。在打开的对话框中,您会看到一个以百分比表示的比例。如果它没有设置为100%,那就试试这个。这可能是你的问题。

相关问题