1

私のプログラムでは、30分ごとにスクリーンショットを撮る方法が必要です。私はグーグルでこの方法を思いつきました:

    public static Bitmap CaptureScreen()
    {
        Bitmap BMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height,
        System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        Graphics GFX = Graphics.FromImage(BMP);
        GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Seen.PrimaryScreen.Bounds.Y, 0, 0,  Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        return BMP;
    }

メソッドの最初の 200 回程度の使用では、すべて正常に機能します。次に、関数が でクラッシュしCopyFromScreen、無効な引数の例外が発生したと表示されます。パラメータが変更されないため、それがなぜなのか少し混乱しています。

関数自体にバグがあるだけでしょうか?もしそうなら、スクリーンショットを撮るための代替手段はありますか?

4

1 に答える 1

1

おそらく 2 つの別々の廃棄失敗です。GraphicsImage/の両方がBitmap実装されIDisposableているため、この 2 つの「明らかな」部分は次のとおりです。

using(Graphics GFX = Graphics.FromImage(BMP)) {
    GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,Seen.PrimaryScreen.Bounds.Y,
        0, 0,  Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
}
return BMP;

ただし、メソッドの呼び出し元(ビットマップの GDI+ ハンドルを解放するusingため) の結果である必要があります。CaptureScreen

using(var screen = CaptureScreen()) {
    // some work here
}
于 2013-05-04T14:16:44.000 に答える