当前位置:网站首页>C# wpf 实现截屏框实时截屏功能
C# wpf 实现截屏框实时截屏功能
2022-07-04 12:50:00 【CodeOfCC】
前言
在《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的绘制机制是完全异步的,无法知道确切的屏幕上绘制完成的时间。所以隐藏后立刻截图依然会截取到控件。
(2)解决方法
简单的解决方法是延时截屏,隐藏控件后500毫秒再截屏。但是这种方法不稳定,尤其是在生产环境,用户的机器各种各样,只要有点卡还是会出bug。
完美的解决方案是使用动画,我们利用动画的多帧绘制特性以及完成事件回调来获取控件真正绘制完成后的时机。具体步骤如下:
隐藏控件->创建动画->注册Completed事件->启动动画->Completed事件中截屏
3、截屏
利用上面步骤获取到的截屏区域,结合《C# wpf 使用GDI+实现截屏》里的简单截屏即完成。截屏后还原被隐藏的控件。
二、完整代码
https://download.csdn.net/download/u013113678/85855030
三、效果预览
总结
以上就是今天要讲的内容,本文简单介绍了wpf截屏框截屏的方法。需要注意两个细节,一个是dpi处理,一个是控件隐藏。gdi+截屏就相对容易实现了,当然还有截屏框的实现还是略微不容易的。这样的一套截屏功能对功能进行简单的拓展就可以用于正式项目了。
边栏推荐
- mac redis安装与使用,连接远程服务器 redis
- BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query 问题
- 德明利深交所上市:市值31亿 为李虎与田华夫妻档
- 瑞吉外卖笔记
- Ruichengxin micro sprint technology innovation board: annual revenue of 367million, proposed to raise 1.3 billion, Datang Telecom is a shareholder
- 国内酒店交易DDD应用与实践——代码篇
- Understand chisel language thoroughly 10. Chisel project construction, operation and testing (II) -- Verilog code generation in chisel & chisel development process
- IP lab monthly resumption · issue 5
- Use the default route as the route to the Internet
- . Net delay queue
猜你喜欢
Animation and transition effects
One of the solutions for unity not recognizing riders
硬件基础知识-二极管基础
Understand chisel language thoroughly 09. Chisel project construction, operation and testing (I) -- build and run chisel project with SBT
CVPR 2022 | greatly reduce the manual annotation required for zero sample learning, and propose category semantic embedding rich in visual information (source code download)
【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法
Apple 5g chip research and development failure: continue to rely on Qualcomm, but also worry about being prosecuted?
Interview disassembly: how to check the soaring usage of CPU after the system goes online?
Understand chisel language thoroughly 05. Chisel Foundation (II) -- combinational circuits and operators
Hardware Basics - diode Basics
随机推荐
Basic mode of service mesh
Worried about "cutting off gas", Germany is revising the energy security law
Idea shortcut keys
[FAQ] summary of common causes and solutions of Huawei account service error 907135701
吃透Chisel语言.04.Chisel基础(一)——信号类型和常量
MongoDB常用28条查询语句(转)
如何在 2022 年为 Web 应用程序选择技术堆栈
golang fmt. Printf() (turn)
Introducing testfixture into unittest framework
【FAQ】華為帳號服務報錯 907135701的常見原因總結和解决方法
IP 实验室月复盘 · 第 5 期
Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
Understand chisel language thoroughly 04. Chisel Foundation (I) - signal type and constant
Lick the dog until the last one has nothing (state machine)
Automatic filling of database public fields
2022危险化学品经营单位主要负责人练习题及模拟考试
Qt如何实现打包,实现EXE分享
MySQL8版本免安装步骤教程
Openharmony application development how to create dayu200 previewer
392. 判断子序列