【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

时间: 2024-08-27 09:47:39

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

DSR 系统开发记录(2014年7月25日):Hibernate User Type 更新操作

今天遇到的问题是在 VisitRecord 编辑保存之后,MedicineComment 中的 Medicine 属性就变成 null 了.经过简单的调查之后发现,在做更新操作时,起作用的并不是 UserType 的 nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) 方法,而是 Object replace(Object original, Object target, O

C#学习(九)之Windows Store App &amp; WP 开发小记(一)

由于课程已经讲述完毕,所以本次学习记录就讨论记录一下我在Windows Store App & WP开发中遇到的一些问题与收获. 一.数据库(Sqlite)的使用 虽然资料很难找,但sqlite在这两个平台的使用还是很简单的. 首先是环境配置阶段: 1.工具->拓展与更新->联机,然后在右上搜索sqlite,之后下载安装下图两个打勾的拓展包,注意要重启VS方才生效. 2.项目->管理NuGet程序包->联机,搜索sqlite,安装下图打勾内容,如果项目多出下图两个文件即安装

LNMP系列网站零基础开发记录(三)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 三.web页面开发 好吧,本来想单独写一章bootstrap的,但是前端确实没什么好写的,这里我们直接结合实际直接开搞吧.做WEB我习惯先把想要的页面模板做完,然后再根据razar或者这里要用到的django template修改.美工确实不太好,P得一手烂图,所以一般都用现成的开源框架,这里我

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

CozyRSS开发记录2-酷炫的皮肤库 1.MaterialDesignToolkit 最开始微软推出Metro设计风格的时候,有人喜欢有人喷.紧接着,Ios也开始做扁平化的UI,这时候,扁平化已成为新的设计趋势.再往后,谷歌也推出了Material Design. MaterialDesignToolkit是一个帮助桌面程序快速应用Material Design的库,并且它是开源的,github地址为: https://github.com/ButchersBoy/MaterialDesign

个人知识管理系统Version1.0开发记录(03)

demo  设 计 一个知识点demo,在数据库和用户界面的互动事件.分三个层次,数据存储,数据方法工具,数据呈现界面.这一次先完成数据存储,按以下逻辑实现.工具:eclipse,oracle数据库,sqldeveloper(改用oracle的sqldeveloper).(当后面数据库复杂时可以考虑PowerDesigner.) 1.考虑软件功能.数据方法.商业元素.逻辑扩展等实用因素,设计实体类. 2.用jdbc连接oracle数据库. 3.数据储存在数据库中,分析oracle数据库的数据类型

phpcms程序二次开发记录

1. phpcms/base.php 中的 pc_base 类 静态类,主要加载各个文件使用.2. pc_base 中 load_sys_func 等带 sys的函数,基本都是加载 lib下文件. func加载functions下: class 加载 class下3. pc_base 中 函数一般第一个参数为文件名,第二个参数为路径,第3个参数有一般为:加载类是否实体化4. pc_base 中 load_app开头则为加载modules下的 functions和class等5. 网站开始入口控制

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

俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 WP7模拟器默认状态只能通过模拟出来的QWERTY键盘输入,用鼠标一个一个点太慢了. 这里介绍下开启/关闭电脑键盘输入的方法,详细操作步骤如下: 首先打开模拟器,在需要输入文字的地方点击鼠标,这时按下电脑键盘的PageUp键即可开启键盘输入,同时虚拟键盘将会自动关闭.如果需要关闭电脑键盘输入开启虚拟键

个人知识管理系统Version1.0开发记录(11)

关 键 字 搜 索 (1)匹配单个属性的关键字:(2)匹配单个对象的关键字:(3)匹配对象集合的关键字:(4)基于事件驱动的:(5)实时搜索,参考win7的搜索功能. 1.备份,java代码,数据库数据. 2.oracle数据库,用户操作. (1)查看数据库默认表空间. select * from database_properties;(2)创建用户create user 用户名 identified by 密码 默认表空间 临时表空间create user dyl identified by

个人知识管理系统Version1.0开发记录(10)

物理分页 这次我们运用Mybatis拦截器来实现物理分页,后面会运用动态sql来实现,或者运用Map/CollectionUtils/StringUtils编写工具类来实现.oracle是运用的rownum,mysql是运用的limit offset,pagesize.代码中有大量注释,可以参考Mybatis基本原理一起阅读.后面,我们会根据一些实际开发需要,把物理分页功能的代码封装成jar包,以后直接调用就好了,比如Mybatis+Spring3的运行环境,可以采用Mybatis动态sql来实