我有一个 WPF 应用程序,我试图在其中获取 WindowsFormsHost 控件的屏幕抓取。为此,我正在做一个 Graphics.CopyFromScreen。在我们测试过的大多数盒子上都可以完美运行,但是我们有一台机器无法获取正确的尺寸值。WPF 给出的宽度和高度与控件的实际宽度和高度不匹配。窥探时,控件的 ActualWidth 和 ActualHeight 也会显示不正确的值。更进一步,当我窥探主窗口(最大化)时,我得到 1550 的 ActualWidth 和 840 的 ActualHeight,但我的屏幕分辨率是 1920x1080。我会理解边框、边距等会偏离几个像素,但是让 WPF 告诉我我的最大化窗口的宽度比实际屏幕短 370 像素,这是没有意义的。
以下是用于捕获控件图像的代码:
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;
}
这是一张可以更好地描述我在说什么的图片:
如您所见,snoop 表示 WindowsFormsHost 的实际宽度和实际高度为 486x336。我记录的任何调试信息都说同样的话。但是,当我打印屏幕并裁剪到绘图中的控件时,实际尺寸为 608x423,相差很大。
作为进一步的更新,看起来 wpf 给出的宽度大约是实际宽度的 80%。对于控件和窗口都是如此。