【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 ...
随机推荐
- [R]R语言中的%>%和%.%
最近在网上看R的代码,常常看到 x %>% y 的写法. 样子看着像是pipe的用法,搜了一下, 没找到语法的相关说明. 今天突然开窍,想着 %>% 可能不是语言本身支持的语法,可能是某个 ...
- http://devdocs.io/【文档收藏】
http://devdocs.io http://bower.io/ www.bower.iobrowserify.org jsPlumb布局 https://github.com/lndb/jsPl ...
- js学习笔记之标准库
在全局函数中,this等于window 在函数被作为某个对象的方法调用时,this等于那个对象. 数组的函数: 检测:Array.isArray() 转换:toString(),toLocalStr ...
- css多行显示省略号
首先说css多行显示省略号和单行文本省略号: 我们知道,单行显示省略号时,我们首先需要设置容器的宽度width:value(具体的值),然后强制文本在一行内显示,即white-spacing:nowr ...
- 复习排序with javascript
最近又翻看了一下数据结构(数据结构学渣). 以前总是看不懂,连冒泡和选择排序都要纠结半天,后来才慢慢有意识能区分开来. 当真的理解了快速排序之后,才觉得,这是个很赞的排序,很容易理解. 于是简单的,模 ...
- 前端-SEO
SEO是 search Engine Optimization (搜索引擎优化) SEO: ①白帽SEO(普通SEO做的优化) 网站标题.关键字.描述 网站内容优化 Robot.txt文件 网站地 ...
- 11个并不广为人知,但值得了解的Python库
这是一篇译文,文中提及了一些不常见但是有用的Python库 原文地址:http://blog.yhathq.com/posts/11-python-libraries-you-might-not-kn ...
- dot
今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...
- java之数据结构之链表及包装类、包
链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...
- canvas初探2
2.2 canvas的绘图环境 canvas仅仅只是一个绘图的容器,其内存在一个绘图环境,该环境对象提供了全部的绘图功能. 目前canvas的绘图环境是2d,但canvas规范在着手准备支持其他类型的 ...