3

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%のようです。これは、コントロールとウィンドウの両方に当てはまります。

4

1 に答える 1

4

ディスプレイのDPI設定を確認しましたか?

これを行うには、[コントロールパネル]-[表示]に移動し、[カスタムテキストサイズ(DPI)の設定]を選択します。開いたダイアログに、パーセンテージへのスケールが表示されます。100%に設定されていない場合は、これを試してください。これはあなたの問題かもしれません。

于 2012-09-20T18:06:15.480 に答える