C# wpf 实现截屏框实时截屏功能

wpf截屏系列

第一章 使用GDI+实现截屏
第二章 使用DockPanel制作截屏框
第三章 实现截屏框热键截屏
第四章 实现截屏框实时截屏(本章)
第五章 使用ffmpeg命令行实现录屏


文章目录

  • wpf截屏系列
  • 前言
  • 一、实现步骤
    • 1、获取截屏区域
    • 2、隐藏控件
      • (1)问题
      • (2)解决方法
    • 3、截屏
  • 二、完整代码
  • 三、效果预览
  • 总结


前言

在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里有些细节需要处理,比如要隐藏截屏框上的控件避免遮挡,处理不同dpi下的坐标位置。


一、实现步骤

1、获取截屏区域

以《C# wpf 使用DockPanel实现截屏框》的界面为例,clipRect是截屏区域控件对象,下面两行代码就可以获取到准确的截屏区域,且不受dpi影响。

var leftTop = clipRect.PointToScreen(new Point(0, 0));
var rightBottom = clipRect.PointToScreen(new Point(clipRect.ActualWidth, clipRect.ActualHeight));

2、隐藏控件

我们需要截屏框内的隐藏控件,比如8个拖动点或工具条。

 clipRect.Visibility = Visibility.Hidden;

(1)问题

直接隐藏控件然后截屏是无效的。因为wpf的绘制机制是完全异步的,无法知道确切的屏幕上绘制完成的时间。所以隐藏后立刻截图依然会截取到控件
C# wpf 实现截屏框实时截屏功能_第1张图片

(2)解决方法

简单的解决方法是延时截屏,隐藏控件后500毫秒再截屏。但是这种方法不稳定,尤其是在生产环境,用户的机器各种各样,只要有点卡还是会出bug。
完美的解决方案是使用动画,我们利用动画的多帧绘制特性以及完成事件回调来获取控件真正绘制完成后的时机。具体步骤如下:

隐藏控件->创建动画->注册Completed事件->启动动画->Completed事件中截屏

3、截屏

利用上面步骤获取到的截屏区域,结合《C# wpf 使用GDI+实现截屏》里的简单截屏即完成。截屏后还原被隐藏的控件。


二、完整代码

https://download.csdn.net/download/u013113678/85855030


三、效果预览


总结

以上就是今天要讲的内容,本文简单介绍了wpf截屏框截屏的方法。需要注意两个细节,一个是dpi处理,一个是控件隐藏。gdi+截屏就相对容易实现了,当然还有截屏框的实现还是略微不容易的。这样的一套截屏功能对功能进行简单的拓展就可以用于正式项目了。

你可能感兴趣的:(音视频,#,wpf,wpf,c#,开发语言,截屏,gdi+)