WPF中如何实现窗口截图(WinForms迁移至MVVM场景)
从WinForms迁移WPF:实现保存对话框关闭后捕获应用窗口截图
我正在把旧WinForms项目迁移到采用MVVM模式的WPF项目,需要实现保存对话框关闭后捕获应用窗口截图的功能。
WinForms中的实现方式
在WinForms里可以轻松实现该功能,代码如下:
Form frm = Form.ActiveForm; if (frm != null) { using (Bitmap bmp = new Bitmap(frm.Width, frm.Height)) { frm.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); bmp.Save(saveFileDialog.FileName, ImageFormat.Png); } }
尝试的WPF代码及问题
我尝试了一段WPF截图代码:
double screenLeft = SystemParameters.VirtualScreenLeft; double screenTop = SystemParameters.VirtualScreenTop; double screenWidth = SystemParameters.VirtualScreenWidth; double screenHeight = SystemParameters.VirtualScreenHeight; using (Bitmap bmp = new Bitmap((int)screenWidth, (int)screenHeight)) { using (Graphics g = Graphics.FromImage(bmp)) { g.CopyFromScreen((int)screenLeft, (int)screenTop, 0, 0, bmp.Size); bmp.Save(nombreArchivo); } }
但这段代码存在两个问题:
- 会捕获整个屏幕,而非目标应用窗口
- 保存对话框关闭后截图会出现重影
我希望找到类似WinForms中Form.ActiveForm的简洁实现方式。
最终可行的WPF方案
经过尝试,找到了可行的实现方案,代码如下:
Window? window = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); if (window != null) { // 根据窗口宽高渲染位图 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)window.ActualWidth, (int)window.ActualHeight, 96, 96, PixelFormats.Pbgra32); renderTargetBitmap.Render(window); // 定义PNG编码器 PngBitmapEncoder png = new PngBitmapEncoder(); png.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); using (Stream stm = File.Create(nombreArchivo)) { png.Save(stm); } }
内容的提问来源于stack exchange,提问作者Andres Diaz De Valdes
相关产品推荐
相关产品推荐

