Example #1
0
        //ウィンドウDCからのキャプチャではアルファ値が変なので、画面全体をキャプチャして切り抜き
        //https://gogowaten.hatenablog.com/entry/2020/11/16/005641
        //仮想画面全体の画像取得
        private BitmapSource GetScreenBitmap()
        {
            var screenDC = API.GetDC(IntPtr.Zero);           //仮想画面全体のDC、コピー元
            var memDC    = API.CreateCompatibleDC(screenDC); //コピー先DC作成
            int width    = (int)SystemParameters.VirtualScreenWidth;
            int height   = (int)SystemParameters.VirtualScreenHeight;
            var hBmp     = API.CreateCompatibleBitmap(screenDC, width, height); //コピー先のbitmapオブジェクト作成

            API.SelectObject(memDC, hBmp);                                      //コピー先DCにbitmapオブジェクトを指定

            //コピー元からコピー先へビットブロック転送
            //通常のコピーなのでSRCCOPYを指定
            API.BitBlt(memDC, 0, 0, width, height, screenDC, 0, 0, API.SRCCOPY);
            //bitmapオブジェクトからbitmapSource作成
            BitmapSource source =
                Imaging.CreateBitmapSourceFromHBitmap(
                    hBmp,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());

            //後片付け
            API.DeleteObject(hBmp);
            _ = API.ReleaseDC(IntPtr.Zero, screenDC);
            _ = API.ReleaseDC(IntPtr.Zero, memDC);

            //画像
            return(source);
        }