首页 > 编程语言 >C# wpf 实现截屏框实时截屏功能

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

时间:2023-08-18 10:36:14浏览次数:31  
标签:控件 clipRect 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));
1
2
2、隐藏控件
我们需要截屏框内的隐藏控件,比如8个拖动点或工具条。

clipRect.Visibility = Visibility.Hidden;
1
(1)问题
直接隐藏控件然后截屏是无效的。因为wpf的绘制机制是完全异步的,无法知道确切的屏幕上绘制完成的时间。所以隐藏后立刻截图依然会截取到控件。

 


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

隐藏控件->创建动画->注册Completed事件->启动动画->Completed事件中截屏
1
3、截屏
利用上面步骤获取到的截屏区域,结合《C# wpf 使用GDI+实现截屏》里的简单截屏即完成。截屏后还原被隐藏的控件。

二、完整代码
https://download.csdn.net/download/u013113678/85855030

三、效果预览

 


总结
以上就是今天要讲的内容,本文简单介绍了wpf截屏框截屏的方法。需要注意两个细节,一个是dpi处理,一个是控件隐藏。gdi+截屏就相对容易实现了,当然还有截屏框的实现还是略微不容易的。这样的一套截屏功能对功能进行简单的拓展就可以用于正式项目了。
————————————————
版权声明:本文为CSDN博主「CodeOfCC」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013113678/article/details/125567308

标签:控件,clipRect,C#,实现,截屏,wpf,隐藏
From: https://www.cnblogs.com/webenh/p/17639733.html

相关文章

  • SpringSecurity实战笔记之RESTful
    =================================RESTful========================================一、JsonPath1、github:https://github.com/json-path/JsonPath二、@JsonView使用步骤(用于解决同一个对象在不同的接口返回的字段不同的场景)1、使用接口来声明多个视图2、在值对象的get方法上指......
  • Snapchat的AI机器人拥有自我意识,把用户吓坏了!
    您的关注是对我最大的支持......
  • C#异步调用Process(),后台静默调用cmd控制台
    C#调用cmd控制台操作,网上有太多的教程了,但是大多数都是执行完一条指令,退出Process,下次执行指令,再次newProcess(),(只为了接收到cmd指令的回复,不然会进程阻塞,程序至此不会再跑。)这种情形如果是执行bat文件,或者执行类似ping这种对执行下条指令没有运行环境要求的指令,影响不大。同......
  • springboot~ApplicationContextAware和Interceptor产生了真感情
    看着题目,有点一头污水吧,事实上,没有经历过,很难去说ApplicationContextAware在什么时候会用到,直接在一个bean对象里,你可以直接使用构造方法注入或者Autowired属性注入的方式来使用其它的bean对象,这在springboot里是非常自然的,也是天然支持的;但如果你的这个bean不是由springioc自动......
  • cmd /c和cmd /k 以及CMD命令
    【转】cmd/c和cmd/kjava的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令。cmd/cdir是执行完dir命令后关闭命令窗口。cmd/kdir是执行完dir命令后不关闭命令窗口。cmd/cstartdir会打开一个新窗口后执行dir指令,原窗口会关闭。cmd/kstartdir会打开一......
  • 直播系统源码协议探索篇(二):网络套接字协议WebSocket
     上一篇我们分析了直播平台的会话初始化协议SIP,他关乎着直播平台的实时通信和多方互动技术的实现,今天我们来讲另一个协议,叫网络套接字协议WebSocket,WebSocket基于TCP在客户端与服务器建立双向通信的网络协议,并且可以通过单个长连接实现。在直播系统源码平台已经成为人们获取知识......
  • 如何实现RTSP推送H.264、RTSP推送H.265(hevc)
    1.rtsp推送流程.主要分两部分:第一部分先发送信令;第二部分发送rtp包。信令流程:1.1先发送OPTIONS,OPTIONS比较常用,就不做详细说明了。1.2发送ANNOUNCE,发送ANNOUNCE主要是把要推送的音视频信息通过sdp格式传给服务器。关于sdp信息如何构造,对于h264请参考rfc6184.h265请参考r......
  • vue-treeselect 树下拉组件被遮挡问题
    vue-treeselect组件官方中文网站: https://www.vue-treeselect.cn/需求背景:在el-tabs内容中添加此组件出现被遮挡问题通过文档查询解决方法<treeselectv-model="params.wardIds":options="hospitalWardTree"value-consists-of="LEAF_PRIORITY"placeholder=......
  • CentOS9中的Glibc2.17源码编译升级到Glibc2.31
    一、准备工作1、配置yum阿里镜像源查看yum当前配置的仓库,如果yum配置的不是阿里云源,请配置阿里云源。yumrepolistall验证是否能ping通阿里云#如果不能ping通可能是DNS没有配置pingmirrors.aliyun.com备份官方的原yum源配置mv/etc/yum.repos.d/CentOS-Base.r......
  • 直播系统源码协议探索篇(二):网络套接字协议WebSocket
    上一篇我们分析了直播平台的会话初始化协议SIP,他关乎着直播平台的实时通信和多方互动技术的实现,今天我们来讲另一个协议,叫网络套接字协议WebSocket,WebSocket基于TCP在客户端与服务器建立双向通信的网络协议,并且可以通过单个长连接实现。在直播系统源码平台已经成为人们获取知识、放......