コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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;
        }