WindowsFormsHostコントロールの画面を取得しようとしているWPFアプリケーションがあります。これを行うために、Graphics.CopyFromScreenを実行しています。これでテストしたほとんどのボックスは完璧に機能しますが、適切なサイズ値を取得していないマシンが1台あります。WPFによって指定される幅と高さは、コントロールの実際の幅と高さと一致しません。スヌーピングすると、コントロールのActualWidthとActualHeightにも誤った値が表示されます。さらに、メインウィンドウ(最大化されている)をスヌープすると、ActualWidthが1550、ActualHeightが840になりますが、画面の解像度は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%のようです。これは、コントロールとウィンドウの両方に当てはまります。