1

私はこれに少し当惑しています。Graphics.CopyFromScreen を使用してデスクトップのセクションを取得する ac#/WPF スクリーン キャプチャ ツールがあります。

XP、Win7、少なくとも 1 つの Windows8 VM など、さまざまなマシンで問題なく動作します。

Win8 が搭載された Acer ZS600 に遭遇しましたが、理解できない奇妙な効果が見られます。

キャプチャすると、正しいサイズの画像が取得されますが、位置が間違っています。左上にオフセットされています。定額ではありません。キャプチャ ウィンドウが画面 0,0 の位置にある場合は問題ありませんが、キャプチャ ウィンドウを原点から離すと、オフセットが増加します。

コードを調べたところ、ウィンドウの位置 (this.Top と this.Left) が間違った数値を報告していることがわかりました。

さらに奇妙なことに、これを Acer Z5771 で試しました。これは、Windows 7 を使用することを除いて、実質的に同じハードウェア構成です。Zs600 グラフィックス ドライバーを更新しようとしましたが、効果はありませんでした。

誰かがこれを理解しているか、修正や回避策を提案していますか?

編集:問題のマシンで効果を示す簡単なアプリをまとめました。私の開発マシンでは問題なく動作します。ここからダウンロード: https://s3-eu-west-1.amazonaws.com/kdownload/Tools/CaptureTool_app.zip

または、コンパイル済みバージョンをダウンロードします: https://s3-eu-west-1.amazonaws.com/kdownload/Tools/capturetest.exe

編集: これは、問題のシステムで使用されているキャプチャ アプリの 2 つのスクリーンショットです。https://s3-eu-west-1.amazonaws.com/kdownload/Tools/ProblemScreencap.png (編集 - そのスクリーンショットでは、x&y の表示数値を幅と高さで切り替えましたが、アップロードされたコードで修正されました。これは無視してください)

4

1 に答える 1

5

DpiOSの設定が100%を超えている可能性があります。

現在のOSdpiに基づいて、チェックして正しい場所に変換するヘルパーメソッドを作成できます。

何かのようなもの。

public Point GetDpiSafeLocation(Point location)
{
    PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
    if (source != null)
    {
        double dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
        double dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
        return new Point(location.X * 96.0 / dpiX, location.Y * 96.0 / dpiY);
    }
    return location;
}

使用法:

 var point = GetDpiSafeLocation(new Point(Left, Top));
于 2013-03-02T22:18:04.853 に答える