【WP开发】记录屏幕操作
在某些应用中,比如游戏,有时候需要将用户的操作记录下来。ScreenCapture类提供了这个功能。但必须注意的是:此屏幕记录功能只对当前应用程序的屏幕有效,即只有当前应用程序在前台运行时才有效。
与使用手机相机捕捉媒体一样,捕捉屏幕也要用到MediaCapture类,大家知道,在使用MediaCapture前,需要调用InitializeAsync方法进行初始化,其中一个重载版本是这样的:
- InitializeAsync(Windows.Media.Capture.MediaCaptureInitializationSettings)
使用MediaCaptureInitializationSettings实例的时候,将ScreenCapture对象的VideoSource属性赋给MediaCaptureInitializationSettings的VideoSource属性;将ScreenCapture的AudioSource属性赋给MediaCaptureInitializationSettings的AudioSource属性。总之,赋值时要对应上就行。
然后就可以使用MediaCapture如同用相机录视频一样录制屏幕了。
下面给大家Show一个示例,示例也比较简单,可能会有1000个Bug,但主要是给大家做演示之用,就不管那么多了。本例就是让ScreenCapture和MediaCapture亲密合作,实现当前应用程序的屏幕记录功能。本示例中的屏幕记录功能包括两方面:1、记录为单张照片;2、录制视频。
首先,在页面上随便放一些控件,并在底部工具栏中定义几个操作按钮。
- <StackPanel>
- <TextBox Header="姓名:"/>
- <DatePicker Header="日生:"/>
- <ComboBox Header="工种:">
- <ComboBoxItem>车工</ComboBoxItem>
- <ComboBoxItem>钳工</ComboBoxItem>
- <ComboBoxItem>铁工</ComboBoxItem>
- </ComboBox>
- <CheckBox Margin="0,20,0,0">临时</CheckBox>
- <CheckBox >调岗</CheckBox>
- <CheckBox>新入职</CheckBox>
- </StackPanel>
- <Page.BottomAppBar>
- <CommandBar>
- <AppBarButton Icon="Camera" Label="截取" Click="OnCapSingle"/>
- <AppBarButton Icon="Video" Label="开始" Click="OnStartRec"/>
- <AppBarButton Icon="Stop" Label="停止" Click="OnStopRec"/>
- </CommandBar>
- </Page.BottomAppBar>
页面上的控件大家随便弄就行了,不必过于讲究,只不过拿来演示用的。
记得曾几何时跟大家讲过,MediaCapture对象一旦初始化之后,会占用系统的资源,在应用程序挂起(就是应用不在前台运行时)时一定要将MediaCapture实例干掉,不然当其他程序访问相同资源时会导致死机,这可能是API没完全优化的原因吧,不过也有可能是应用程序生命周期机制引起的。不管哪种情况,我们只需记住在挂起时进行清理就行了。
这里为了方便,我把MediaCapture对象的初始化和清理代码都写到App类中,大家在下载我的示例后记得到App类中找就是了。
- #region 方法
- /// <summary>
- /// 清理MediaCapture组件
- /// </summary>
- public static async Task CleanupCaptureAsync()
- {
- if (CurrentCapture != null)
- {
- if (IsRecording)
- {
- await CurrentCapture.StopRecordAsync();
- IsRecording = false;
- }
- CurrentCapture.Dispose();
- CurrentCapture = null;
- }
- }
- /// <summary>
- /// 初始化Capture组件
- /// </summary>
- public static async Task InitailizeCapureAsync()
- {
- CurrentCapture = new MediaCapture();
- ScreenCapture screenCap = ScreenCapture.GetForCurrentView();
- MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
- // 设置源
- //settings.AudioSource = screenCap.AudioSource;
- settings.VideoSource = screenCap.VideoSource;
- // 只捕捉视频
- settings.StreamingCaptureMode = StreamingCaptureMode.Video;
- await CurrentCapture.InitializeAsync(settings);
- }
- #endregion
CurrentCapture是定义在App类中的静态属性,另外再加一个IsRecording静态属性,这个表示是否正在录制视频。
- #region 属性
- /// <summary>
- /// 引用正在使用的MediaCapture对象
- /// </summary>
- public static MediaCapture CurrentCapture { get; set; }
- /// <summary>
- /// 标识是否处于录制状态
- /// </summary>
- public static bool IsRecording { get; set; }
- #endregion
声明为静态属性和静态方法是为了便于访问。
在程序挂起时对MediaCapture实例进行清理。
- private async void OnSuspending(object sender, SuspendingEventArgs e)
- {
- var deferral = e.SuspendingOperation.GetDeferral();
- // TODO: 保存应用程序状态并停止任何后台活动
- await CleanupCaptureAsync();
- deferral.Complete();
- }
好,以下代码是截图功能,即记录屏幕内容到一张图片中。
- private async void OnCapSingle(object sender, RoutedEventArgs e)
- {
- Button btn = sender as Button;
- btn.IsEnabled = false;
- if (App.CurrentCapture == null)
- {
- await App.InitailizeCapureAsync();
- }
- StorageFolder cam = KnownFolders.CameraRoll;
- StorageFile newFile = await cam.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") + ".png", CreationCollisionOption.ReplaceExisting);
- await App.CurrentCapture.CapturePhotoToStorageFileAsync(ImageEncodingProperties.CreatePng(), newFile);
- await App.CleanupCaptureAsync(); //用完后清理
- btn.IsEnabled = true;
- }
下面代码分别处理开始录制与停止录制。
- private async void OnStartRec(object sender, RoutedEventArgs e)
- {
- if (!App.IsRecording)
- {
- if (App.CurrentCapture == null)
- {
- await App.InitailizeCapureAsync();
- }
- StorageFolder vdlib = KnownFolders.VideosLibrary;
- StorageFile newfile = await vdlib.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") + ".mp4", CreationCollisionOption.ReplaceExisting);
- // 开始录制视频
- await App.CurrentCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), newfile);
- // 标识已经开始录制
- App.IsRecording = true;
- }
- }
- private async void OnStopRec(object sender, RoutedEventArgs e)
- {
- if (App.IsRecording)
- {
- // 停止录制并释放
- await App.CleanupCaptureAsync();
- }
- }
虽然与ScreenCapture结合用MediaCapture类记录屏幕不需要相机,但是由于MediaCapture类对摄像头有要求,因此需要打开清单文件,在“功能”选项卡页勾选“网络摄像机”,本例截取的图片存到相册目录中,录好的视频放在视频库中,故还要勾上“图片库”和“视频库”。
运行程序后,就可以测试了。
OK,完工,正好开饭。
源码下载:http://files.cnblogs.com/files/tcjiaan/ScreenCaptureApp.zip
【WP开发】记录屏幕操作的更多相关文章
- CozyRSS开发记录19-窗口标题栏交互
CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...
- CozyRSS开发记录14-RSS源管理初步完工
CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...
- CozyRSS开发记录12-MVVM,绑定RSS源和数据
CozyRSS开发记录12-MVVM,绑定RSS源和数据 1.引入MvvmLight MVVM最近貌似在前端那块也挺火的.据说,WPF的程序如果不用MVVM,那跟MFC和winform的,也没啥区别. ...
- CozyRSS开发记录2-酷炫的皮肤库
CozyRSS开发记录2-酷炫的皮肤库 1.MaterialDesignToolkit 最开始微软推出Metro设计风格的时候,有人喜欢有人喷.紧接着,Ios也开始做扁平化的UI,这时候,扁平化已成为 ...
- Mysql数据库连接、查询、记录集操作代码
Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pcon ...
- WP开发笔记——WP7 SDK使用技巧
俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...
- WP 开发中.xaml 与.xaml.cs
关于 WP 开发中.xaml 与.xaml.cs 的关系 今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...
- loadrunner 脚本开发-文件读写操作
脚本开发-文件读写操作 by:授客 QQ:1033553122 函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t co ...
- Linux记录屏幕输出log
应用场景: 请专家通过Console处理问题时,保留console输出无疑是非常有意义的.一来可留着作为维护日志,二来可供事后学习. 最简洁的方式是通过系统自带的script命令去记录. $ scri ...
随机推荐
- CODEVS 天梯 代码记录
所有水题均被折叠 Lv.1 青铜 1201 #include<iostream> #include<cstring> #include<algorithm> #in ...
- NOI2016退役记
具体写点儿什么还没想好,先挖坑吧.
- Unity3d:UI面板管理整合进ToLua
本文基于 https://github.com/chiuan/TTUIFramework https://github.com/jarjin/LuaFramework_UGUI 进行的二次开发,Tha ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- Axure的学习
这两天开始学习Axure,首先做的是下载Axure的7.0版本,然后汉化,可以百度找.不过我在开始学习时也遇到一些问题.在开始添加元件库时还是很顺利的,不过在我发布的时候,我发现了一些问题.发布一开始 ...
- Linux下Nano命令使用指南
1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用? 打开或新建文件 #nano 文件名 禁用自动换行 #nano -w /etc/fs ...
- script async 和script defer的区别
浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...
- 续关于C#的微信开发的入门记录一
前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...
- Python语言中对于json数据的编解码——Usage of json a Python standard library
一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...