在某些应用中,比如游戏,有时候需要将用户的操作记录下来。ScreenCapture类提供了这个功能。但必须注意的是:此屏幕记录功能只对当前应用程序的屏幕有效,即只有当前应用程序在前台运行时才有效。

与使用手机相机捕捉媒体一样,捕捉屏幕也要用到MediaCapture类,大家知道,在使用MediaCapture前,需要调用InitializeAsync方法进行初始化,其中一个重载版本是这样的:

  1. InitializeAsync(Windows.Media.Capture.MediaCaptureInitializationSettings)

使用MediaCaptureInitializationSettings实例的时候,将ScreenCapture对象的VideoSource属性赋给MediaCaptureInitializationSettings的VideoSource属性;将ScreenCapture的AudioSource属性赋给MediaCaptureInitializationSettings的AudioSource属性。总之,赋值时要对应上就行。

然后就可以使用MediaCapture如同用相机录视频一样录制屏幕了。

下面给大家Show一个示例,示例也比较简单,可能会有1000个Bug,但主要是给大家做演示之用,就不管那么多了。本例就是让ScreenCapture和MediaCapture亲密合作,实现当前应用程序的屏幕记录功能。本示例中的屏幕记录功能包括两方面:1、记录为单张照片;2、录制视频。

首先,在页面上随便放一些控件,并在底部工具栏中定义几个操作按钮。

  1. <StackPanel>
  2. <TextBox Header="姓名:"/>
  3. <DatePicker Header="日生:"/>
  4. <ComboBox Header="工种:">
  5. <ComboBoxItem>车工</ComboBoxItem>
  6. <ComboBoxItem>钳工</ComboBoxItem>
  7. <ComboBoxItem>铁工</ComboBoxItem>
  8. </ComboBox>
  9. <CheckBox Margin="0,20,0,0">临时</CheckBox>
  10. <CheckBox >调岗</CheckBox>
  11. <CheckBox>新入职</CheckBox>
  12. </StackPanel>
  13.  
  14. <Page.BottomAppBar>
  15. <CommandBar>
  16. <AppBarButton Icon="Camera" Label="截取" Click="OnCapSingle"/>
  17. <AppBarButton Icon="Video" Label="开始" Click="OnStartRec"/>
  18. <AppBarButton Icon="Stop" Label="停止" Click="OnStopRec"/>
  19. </CommandBar>
  20. </Page.BottomAppBar>

页面上的控件大家随便弄就行了,不必过于讲究,只不过拿来演示用的。

记得曾几何时跟大家讲过,MediaCapture对象一旦初始化之后,会占用系统的资源,在应用程序挂起(就是应用不在前台运行时)时一定要将MediaCapture实例干掉,不然当其他程序访问相同资源时会导致死机,这可能是API没完全优化的原因吧,不过也有可能是应用程序生命周期机制引起的。不管哪种情况,我们只需记住在挂起时进行清理就行了。

这里为了方便,我把MediaCapture对象的初始化和清理代码都写到App类中,大家在下载我的示例后记得到App类中找就是了。

  1. #region 方法
  2. /// <summary>
  3. /// 清理MediaCapture组件
  4. /// </summary>
  5. public static async Task CleanupCaptureAsync()
  6. {
  7. if (CurrentCapture != null)
  8. {
  9. if (IsRecording)
  10. {
  11. await CurrentCapture.StopRecordAsync();
  12. IsRecording = false;
  13. }
  14. CurrentCapture.Dispose();
  15. CurrentCapture = null;
  16. }
  17. }
  18.  
  19. /// <summary>
  20. /// 初始化Capture组件
  21. /// </summary>
  22. public static async Task InitailizeCapureAsync()
  23. {
  24. CurrentCapture = new MediaCapture();
  25. ScreenCapture screenCap = ScreenCapture.GetForCurrentView();
  26.  
  27. MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
  28. // 设置源
  29. //settings.AudioSource = screenCap.AudioSource;
  30. settings.VideoSource = screenCap.VideoSource;
  31. // 只捕捉视频
  32. settings.StreamingCaptureMode = StreamingCaptureMode.Video;
  33. await CurrentCapture.InitializeAsync(settings);
  34. }
  35. #endregion

CurrentCapture是定义在App类中的静态属性,另外再加一个IsRecording静态属性,这个表示是否正在录制视频。

  1. #region 属性
  2. /// <summary>
  3. /// 引用正在使用的MediaCapture对象
  4. /// </summary>
  5. public static MediaCapture CurrentCapture { get; set; }
  6. /// <summary>
  7. /// 标识是否处于录制状态
  8. /// </summary>
  9. public static bool IsRecording { get; set; }
  10. #endregion

声明为静态属性和静态方法是为了便于访问。

在程序挂起时对MediaCapture实例进行清理。

  1. private async void OnSuspending(object sender, SuspendingEventArgs e)
  2. {
  3. var deferral = e.SuspendingOperation.GetDeferral();
  4.  
  5. // TODO: 保存应用程序状态并停止任何后台活动
  6. await CleanupCaptureAsync();
  7.  
  8. deferral.Complete();
  9. }

好,以下代码是截图功能,即记录屏幕内容到一张图片中。

  1. private async void OnCapSingle(object sender, RoutedEventArgs e)
  2. {
  3. Button btn = sender as Button;
  4. btn.IsEnabled = false;
  5. if (App.CurrentCapture == null)
  6. {
  7. await App.InitailizeCapureAsync();
  8. }
  9. StorageFolder cam = KnownFolders.CameraRoll;
  10. StorageFile newFile = await cam.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") + ".png", CreationCollisionOption.ReplaceExisting);
  11. await App.CurrentCapture.CapturePhotoToStorageFileAsync(ImageEncodingProperties.CreatePng(), newFile);
  12. await App.CleanupCaptureAsync(); //用完后清理
  13. btn.IsEnabled = true;
  14. }

下面代码分别处理开始录制与停止录制。

  1. private async void OnStartRec(object sender, RoutedEventArgs e)
  2. {
  3. if (!App.IsRecording)
  4. {
  5. if (App.CurrentCapture == null)
  6. {
  7. await App.InitailizeCapureAsync();
  8. }
  9. StorageFolder vdlib = KnownFolders.VideosLibrary;
  10. StorageFile newfile = await vdlib.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") + ".mp4", CreationCollisionOption.ReplaceExisting);
  11. // 开始录制视频
  12. await App.CurrentCapture.StartRecordToStorageFileAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), newfile);
  13. // 标识已经开始录制
  14. App.IsRecording = true;
  15. }
  16. }
  17.  
  18. private async void OnStopRec(object sender, RoutedEventArgs e)
  19. {
  20. if (App.IsRecording)
  21. {
  22. // 停止录制并释放
  23. await App.CleanupCaptureAsync();
  24. }
  25. }

虽然与ScreenCapture结合用MediaCapture类记录屏幕不需要相机,但是由于MediaCapture类对摄像头有要求,因此需要打开清单文件,在“功能”选项卡页勾选“网络摄像机”,本例截取的图片存到相册目录中,录好的视频放在视频库中,故还要勾上“图片库”和“视频库”。

运行程序后,就可以测试了。

    

OK,完工,正好开饭。

源码下载:http://files.cnblogs.com/files/tcjiaan/ScreenCaptureApp.zip

【WP开发】记录屏幕操作的更多相关文章

  1. CozyRSS开发记录19-窗口标题栏交互

    CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...

  2. CozyRSS开发记录14-RSS源管理初步完工

    CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...

  3. CozyRSS开发记录12-MVVM,绑定RSS源和数据

    CozyRSS开发记录12-MVVM,绑定RSS源和数据 1.引入MvvmLight MVVM最近貌似在前端那块也挺火的.据说,WPF的程序如果不用MVVM,那跟MFC和winform的,也没啥区别. ...

  4. CozyRSS开发记录2-酷炫的皮肤库

    CozyRSS开发记录2-酷炫的皮肤库 1.MaterialDesignToolkit 最开始微软推出Metro设计风格的时候,有人喜欢有人喷.紧接着,Ios也开始做扁平化的UI,这时候,扁平化已成为 ...

  5. Mysql数据库连接、查询、记录集操作代码

    Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pcon ...

  6. WP开发笔记——WP7 SDK使用技巧

    俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...

  7. WP 开发中.xaml 与.xaml.cs

    关于 WP 开发中.xaml 与.xaml.cs 的关系   今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...

  8. loadrunner 脚本开发-文件读写操作

    脚本开发-文件读写操作 by:授客 QQ:1033553122 函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t co ...

  9. Linux记录屏幕输出log

    应用场景: 请专家通过Console处理问题时,保留console输出无疑是非常有意义的.一来可留着作为维护日志,二来可供事后学习. 最简洁的方式是通过系统自带的script命令去记录. $ scri ...

随机推荐

  1. CODEVS 天梯 代码记录

    所有水题均被折叠 Lv.1 青铜 1201 #include<iostream> #include<cstring> #include<algorithm> #in ...

  2. NOI2016退役记

    具体写点儿什么还没想好,先挖坑吧.

  3. Unity3d:UI面板管理整合进ToLua

    本文基于 https://github.com/chiuan/TTUIFramework https://github.com/jarjin/LuaFramework_UGUI 进行的二次开发,Tha ...

  4. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)

    原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...

  5. Axure的学习

    这两天开始学习Axure,首先做的是下载Axure的7.0版本,然后汉化,可以百度找.不过我在开始学习时也遇到一些问题.在开始添加元件库时还是很顺利的,不过在我发布的时候,我发现了一些问题.发布一开始 ...

  6. Linux下Nano命令使用指南

    1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用?   打开或新建文件 #nano 文件名    禁用自动换行 #nano -w /etc/fs ...

  7. script async 和script defer的区别

    浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...

  8. 续关于C#的微信开发的入门记录一

    前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...

  9. Python语言中对于json数据的编解码——Usage of json a Python standard library

    一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...

  10. “我爱背单词”beta版发布与使用说明

    我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院  拒 ...