■ 画面をキャプチャする

C#で画面キャプチャを行うにはSendKeys.SendWaitが便利だ。SendKeys.SendWaitはアプリケーションにキーストロークを送信し、そのプロセスが開始されるまで待機する。もちろん、Ctrl + PrtScのようなキーストロークの組み合わせも送信可能なので、これを利用して画面キャプチャを行う。

キャプチャしたデータはCtrl + PrtScキーを押下したのと同様にクリップボードに保存される。アプリケーションではクリップボード内のデータをチェックし、ビットマップに変換する。

            SendKeys.SendWait("^{PRTSC}"); // 画面キャプチャ
            IDataObject data = Clipboard.GetDataObject(); // クリップボードからキャプチャしたデータを取り出す
            // 取り出したデータをビットマップに変換
            if(data.GetDataPresent(DataFormats.Bitmap)) 
            {
                bitmap = (Bitmap)data.GetData(DataFormats.Bitmap);
            }

キーストロークによる画面キャプチャを採用できないときはAPIによる方法もある。以下は全画面のキャプチャを行う例である。GetDesktopWindowでデスクトップのハンドルを取得し、転送先のBitmapオブジェクトともにGraphicsオブジェクトを介してデバイスコンテキストハンドルを取得する。あとはBitBltでこのデバイスコンテキスト間でビットマップを転送する。

        [DllImport("gdi32.dll")]
        extern static bool BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,uint dwRop);
        [DllImport("user32.dll")]
        extern static IntPtr GetDesktopWindow();
        const int SRCCOPY = 0x00CC0020;

        // 途中省略

        // APIでキャプチャ
        public void ScreenCaptureWithApi() {
            Rectangle r = Screen.PrimaryScreen.Bounds;
//          Rectangle r = SystemInformation.VirtualScreen;

            IntPtr h = GetDesktopWindow();
            Graphics g1 = Graphics.FromHwnd(h);
            IntPtr hdc1 = g1.GetHdc();      // デスクトップのデバイスコンテキストハンドル
            bitmap = new Bitmap(r.Width,r.Height);
            Graphics g2 = Graphics.FromImage(bitmap);
            IntPtr hdc2 = g2.GetHdc();      // Bitmapのデバイスコンテキストハンドル
            // BitBlt
            BitBlt(hdc2,0,0,r.Width,r.Height,hdc1,0,0,SRCCOPY);

            g2.ReleaseHdc(hdc2);
            g1.ReleaseHdc(hdc1);
        }

"画面をキャプチャする"のサンプル
(2005/07/12)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2012 モバイル開発系(K) All rights reserved.
[Home]