2015年4月9日木曜日

C#でスクリーンをキャプチャする

C#でスクリーンをキャプチャするだけのコードです

フルキーボードではPrintScreenキーがありますが、必要最小限のキーボードではそのキーがありません
Windows7などには"Snipping Tool"が搭載されており、任意の位置をキャプチャすることが出来ますが、メニューを表示した状態やドロップダウンリストを表示した状態でのキャプチャは不可能です

このプログラムでは即時と5秒後のキャプチャが可能で、5秒の間に表示操作を行えばメニュー内も表示できます(定数を変更すればそれ以外の時間でも可能です)

マルチディスプレイには半分対応という感じで、マウスカーソルがあるスクリーンをキャプチャします
つまり全てのスクリーンを1枚でキャプチャすることは出来ません

このプログラムではキャプチャ後にクリップボードに保存します
必要ならファイルに保存する機能を追加してください


using System;
using System.Drawing;
using System.Windows.Forms;

namespace ScreenCapture {
    public partial class Form1 : Form {
        DateTime? CaptureTime = null;

        public Form1() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            CaptureTime = DateTime.Now;
        }

        private void button2_Click(object sender, EventArgs e) {
            CaptureTime = DateTime.Now.AddSeconds(5);
        }

        private void timer1_Tick(object sender, EventArgs e) {
            if (CaptureTime == null) {
                return;
            }

            double ts = ((TimeSpan)(CaptureTime - DateTime.Now)).TotalSeconds;

            if (ts <= 0) {
                ScreenCapture();

                CaptureTime = null;
            } else {
                this.Text = ts.ToString("0.0");
            }
        }

        void ScreenCapture() {
            Rectangle rec =Screen.GetWorkingArea(Form.MousePosition);

            Bitmap bmp = new Bitmap(rec.Width, rec.Height);
            using (Graphics gra = Graphics.FromImage(bmp)) {
                gra.CopyFromScreen(new Point(rec.X, rec.Y), new Point(0, 0), bmp.Size);
            }

            if (pictureBox1.Image != null) {
                pictureBox1.Image.Dispose();
            }

            pictureBox1.Image = bmp;

            Clipboard.SetImage(bmp);

            this.Text = rec.Width + "x" + rec.Height;
        }
    }
}

0 件のコメント:

コメントを投稿