public static System.Windows.Media.Imaging.WriteableBitmap CaptureWindow(IntPtr hwnd) { if (!User32DllMethodsInvoker.IsWindow(hwnd)) { return(null); } // このプロセスでの処理中に他プロセスのターゲット ウィンドウ ハンドルが無効化されることは十分にありうる。 // 例外を投げたりしないで、各 API の戻り値を随時チェックしていくほうが無難。 // アサーションも失敗させない。 var winRect = new Win32Commons.RECT(); bool retval = User32DllMethodsInvoker.GetWindowRect(hwnd, ref winRect); if (!retval || winRect.Width <= 0 || winRect.Height <= 0) { return(null); } using (var gdipBitmap = CaptureWindow(hwnd, winRect.Width, winRect.Height)) { System.Diagnostics.Debug.Assert(gdipBitmap != null); System.Diagnostics.Debug.Assert(gdipBitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb); // TODO: DPI はどうする? 高 DPI 設定の場合でも論理ピクセルではなく実ピクセル単位で画像データを取得するべき。 var wicBitmap = new System.Windows.Media.Imaging.WriteableBitmap(winRect.Width, winRect.Height, MyDeviceHelper.DefaultDpi, MyDeviceHelper.DefaultDpi, System.Windows.Media.PixelFormats.Pbgra32, null); CopyGdipBitmapToWicBitmap(gdipBitmap, wicBitmap); return(wicBitmap); } }
public bool CaptureWindow(IntPtr hwnd, System.Windows.Int32Rect clippingRect) { System.Diagnostics.Debug.Assert(this.wicBitmap != null && this.gdipBitmap != null); if (!User32DllMethodsInvoker.IsWindow(hwnd)) { return(false); } MyWpfGdiPlusInteropHelper.CaptureWindow(hwnd, this.gdipBitmap, clippingRect); return(MyWpfGdiPlusInteropHelper.CopyGdipBitmapToWicBitmap(this.gdipBitmap, this.wicBitmap)); }
private static void SaveImageAsPngFile(System.Windows.Media.Imaging.WriteableBitmap bitmap, string fileName, IntPtr hwnd, System.Windows.Int32Rect clippingRect) { if (bitmap == null) { throw new ArgumentNullException("Invalid bitmap!!"); } if (!User32DllMethodsInvoker.IsWindow(hwnd)) { throw new ArgumentException("Invalid window!!"); } // クライアント矩形やユーザー定義クリッピング矩形で切り出した内容のみを保存する。 var intersectRect = MyWin32InteropHelper.CalcClientIntersectRect(hwnd, clippingRect); System.Diagnostics.Debug.Assert(intersectRect.HasArea); var tempSubBitmap = new System.Windows.Media.Imaging.WriteableBitmap(intersectRect.Width, intersectRect.Height, MyDeviceHelper.DefaultDpi, MyDeviceHelper.DefaultDpi, System.Windows.Media.PixelFormats.Pbgra32, null); try { tempSubBitmap.Lock(); bitmap.CopyPixels(new System.Windows.Int32Rect(0, 0, intersectRect.Width, intersectRect.Height), tempSubBitmap.BackBuffer, tempSubBitmap.PixelWidth * tempSubBitmap.PixelHeight * 4, tempSubBitmap.PixelWidth * 4); } catch (Exception) { throw; } finally { tempSubBitmap.Unlock(); } using (var stream = new System.IO.FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); //encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bitmap)); encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(tempSubBitmap)); encoder.Save(stream); } tempSubBitmap = null; }