You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:35:12