//ウィンドウ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); }