2015-09-07 41 views
6

私はスクリーンのスクリーンショット/ビットマップを作成しようとしています。私はこの関数を書いた:150%のスケーリングでGraphics.CopyFromScreenを使用してスクリーンショットを撮る

public static Bitmap CreateScreenshot(Rectangle bounds) 
{ 
    var bmpScreenshot = new Bitmap(bounds.Width, bounds.Height, 
            PixelFormat.Format32bppArgb); 
    var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 
    gfxScreenshot.CopyFromScreen(bounds.X, bounds.Y, 
     0, 0, 
     new Size(bounds.Size.Width, bounds.Size.Height), 
     CopyPixelOperation.SourceCopy); 
    return bmpScreenshot; 
} 

この関数は、自分自身にビットマップを描画する必要がある私のオーバーレイフォームで呼び出されています。私は現在、GDI +をプロセス全体に使用しています。

private void ScreenshotOverlay_Load(object sender, EventArgs e) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
     Size += screen.Bounds.Size; 
    Location = Screen.PrimaryScreen.Bounds.Location; 

    _screenshot = BitmapHelper.CreateScreenshot(new Rectangle(new Point(0, 0), Size)); 
    Invalidate(); // The screenshot/bitmap is drawn here 
} 

はい、私は後でビットマップを配置するので、心配しないでください。 ;) 私のラップトップとデスクトップコンピュータでこれは正常に動作します。私はこれをさまざまな解像度でテストしましたが、計算は正しいです。私はフォーム上の画面のイメージを見ることができます。

問題はサーフェス3から始まります。すべての要素は1.5倍(150%)スケールされています。したがって、DPIが変更されることを意味します。そこでスクリーンショットを撮ろうとすると、スクリーンの左上部分のようにキャプチャされますが、全体のキャプチャはされません。 は、私はGoogleとのStackOverflowを通じて自分の道を作り、さまざまな物事を試してみた:

  1. は、DPIを取得する96ことによってそれを分割し、この要因で画面の大きさのコンポーネント(XとY)を掛けます。
  2. アプリケーションをDPIに対応させるために、application.manifestにエントリを追加します。

最初の方法では目的の結果が得られませんでした。 2番目の方法はありましたが、アプリケーション全体を調整する必要があります。これはWindowsフォームではかなり複雑です。

ここで私の質問になる:画面全体のスクリーンショットをキャプチャする方法はありますか?スケーリングファクタが1以上(DPIが高い)であってもキャプチャできますか? どこでも動作させるには、これを行う方法が必要です。

しかし、この時点で私は私を助けることができる本当の検索結果はありませんでした。 ありがとうございます。

+2

それは「複雑」ではない、あなただけのいくつかの悪い習慣を捨て去るする必要が。それでは、高DPIモニタがなくなることはないでしょう。 –

+1

@HansPassant Hm、大丈夫です。それから、私がおそらくできることはほかにありません。私は正しいのですか?もしそうなら、私は自分のアプリケーションを完全にDPI対応にしようとします。 –

答えて

1

これはSharpAVIのライブラリ内にあります。これは、解像度スケールに関係なくデバイスでうまく動作します。私はサーフェス3で150%でテストしました。

SharpAVIがここで見つけることができ

https://github.com/baSSiLL/SharpAviそれはビデオのためであるが、各フレームを取得するときと同様のcopyFromScreenメソッドを使用しています。

graphics.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(screenWidth, screenHeight)); 
+1

なぜ私はここでダウン投票を得たか分かりません。現在、アプリケーションマニフェストにエントリを追加せずに1以上のスケールファクタでスクリーンショットを取得できます。 – ickydime

関連する問題