WPF提供的尺寸值不正确

3
我有一个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;
}

这里有一张图片更好地描述了我所说的内容: enter image description here 如您所见,Snoop表示WindowsFormsHost的实际宽度和实际高度为486x336。我记录的任何调试信息都是相同的。然而,在屏幕截图并在画图中裁剪到控件时,实际大小为608x423,这是一个相当大的差异。
进一步更新,看起来wpf给出的宽度大约是实际宽度的80%。这对控件和窗口都是成立的。

2
实际高度和实际宽度属性不是以像素为单位的,而是以设备独立单位为单位的。此外,你得到的实际高度和实际宽度比你预期的大还是小? - Tejas Sharma
更小了。与上面提出的主窗口示例一样,当宽度应该更大时,主窗口显示1550的实际宽度。 - flamebaud
你能否发布你的代码,这样我就可以运行它并查看是否得到相同的结果? - Tejas Sharma
你什么时候调用 CreateBitmapFromVisual 函数?在构造控件时吗?实际控件的尺寸会受到主题和字体放大等因素的影响,最终的尺寸只有在控件实际呈现后才能确定。你必须等到控件绘制完成后才能获取其屏幕尺寸。 - Dour High Arch
CreateBitmapFromVisual方法在控件绘制完成后才被调用。从整个窗口的ActualWidth明显小于应有的宽度来看,我认为这与控件本身关系不大,更多地是与框架和系统之间的交互有关。 - flamebaud
您的显示器似乎以120 DPI运行。 当您的显示器以96 DPI运行时,ActualWidthActualHeight测量的设备无关单位仅与像素匹配。 - RandomEngy
1个回答

4

你有查看显示器DPI设置吗?

要进行此操作,请转到控制面板 - 显示,然后选择设置自定义文本大小(DPI)。在打开的对话框中,您将看到一个比例尺。如果它未设置为100%,请尝试更改。这可能是您的问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接