由于一些不得不做的事(哈,有时间再聊),所以就不得不写一个关于录屏的软件了,如此无力的开篇,开始吧。

  在网上搜了很多关于录屏的源码,发现都使不了,剧情的需要很难满足。于是突然想到了github上的一个录屏的软件,就引用过来了,稍加修改就用上了(核心代码基本没动)~~~刚查了下,github上没了?!

  剧情需要:开机启动, 自动检测对应软件启动情况并进行录屏,当然最主要的就是录屏这个技术了。

  经过几番整弄算是能用了。

  这里贴上核心代码

internal class ScreenRecordHelper
{
#region Fields
private const int DEFAULT_FRAME_RATE = ;
private int screenWidth;
private int screenHight;
private int bitRate;
private int frameRate;
internal bool isRecording;
private int framesCount;
private string fileName;
private Stopwatch stopWatch;
private Rectangle screenArea;
private VideoFileWriter videoWriter;
private ScreenCaptureStream videoStreamer;
private FolderBrowserDialog folderBrowser;
private VideoCodec videoCodec;
#endregion public ScreenRecordHelper()
{
screenWidth = SystemInformation.VirtualScreen.Width;//Screen.PrimaryScreen.Bounds.Width;
screenHight = SystemInformation.VirtualScreen.Height; // Screen.PrimaryScreen.Bounds.Height;不论注释的或没注释的发现在win10系统上是不能全屏录制的,
                                        只能部分,win8上没试过,由于我装的是win10系统,没有win7,就先这样写了,至于win10系统有自己的
                                        一套录制方法,还挺牛逼,我们可以使用win+G键来开始,还可以自己来创建录制软件(只适用于win8.x
                                        及其以上),msdn提供了文章:
                                        https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn642093.aspx
frameRate = DEFAULT_FRAME_RATE;
isRecording = false;
framesCount = default(int);
stopWatch = new Stopwatch();
screenArea = Rectangle.Empty;
videoWriter = new VideoFileWriter();
folderBrowser = new FolderBrowserDialog();
videoCodec = (VideoCodec)Enum.Parse(typeof(VideoCodec), ScreenRecord.codec);
bitRate = ScreenRecord.bitRate;
} /// <summary>
/// 开始录屏
/// </summary>
internal void StartRecording()
{
try
{
InitializeRecordingParameters();
videoStreamer = new ScreenCaptureStream(screenArea);
videoStreamer.NewFrame += new NewFrameEventHandler(VideoStreamer_NewFrame);
videoStreamer.Start();
stopWatch.Start(); }
catch (Exception ex)
{ throw ex;
} }
internal void StopRecord()
{
isRecording = false;
} private void VideoStreamer_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (isRecording)
{
framesCount++;
videoWriter.WriteVideoFrame(eventArgs.Frame);
}
else
{
stopWatch.Reset();
videoStreamer.Stop();
videoWriter.Close();
videoWriter.Dispose();
}
} private void InitializeRecordingParameters()
{
if (!isRecording)
{
isRecording = true;
SetScreenArea();
FileName = string.Format(@"{0}{1}-{2}.avi", "ScreenDraw", "bySTAR", new Random().Next() + DateTime.Now.ToString("yyyy-MM-dd_HH_mm"));
videoWriter.Open(FileName, screenWidth, screenHight, frameRate, videoCodec, bitRate);
}
} private string FileName
{
get { return this.fileName; }
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException
("fileName", "File name can not be empty or null");
} this.fileName = value;
}
} private void SetScreenArea()
{
foreach (Screen screen in Screen.AllScreens)
{
this.screenArea = Rectangle.Union(this.screenArea, screen.Bounds);
} if (this.screenArea == Rectangle.Empty)
{
throw new InvalidOperationException("Screan area can not be set");
}
}
}

需要配置如下方这三个

internal static string savePath = Directory.GetCurrentDirectory();
internal static string codec = "MSMPEG4v2";
internal static int bitRate = ;

解码器可以设置"MPEG4", "WMV1", "WMV2", "MSMPEG4v2", "MSMPEG4v3", "H263P", "FLV1", "MPEG2", "Raw"

比特率就按自己想要的设定了,可以google下,我这里设定为200000,也有300000,或者低点,测试下就知道了

还有一个上方写的DEFAULT_FRAME_RATE,帧率,录制的帧率,我用的是15帧,感觉太低了手速不够

相关dll需要引入:

    avcodec-53.dll

    avdevice-53.dll

    avfilter-2.dll

    avformat-53.dll

    avutil-51.dll

    和最主要的有,AForge.dll,AForge.Video.dll,Aforge.Video.FFMPEG.dll

    其中创建的时候需要使用x86的的生成,这里给个在github上的那哥们的code,http://pan.baidu.com/s/1o81s0xs

可能不太深入,只是需求想做这样的软件,后边由于比较忙就没怎么深入,只是分享下困扰了我一段时间的录屏,希望大家多多包涵~~~

我在刚开始的时候也遇到了一些小问题,有些解决了,有些则是替代了

ScreenRecord(about C# winform)的更多相关文章

  1. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

  2. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  3. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  4. winform 窗体圆角设计

    网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...

  5. WinForm设置控件焦点focus

    winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文本框里了. ②Winfor ...

  6. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  7. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  8. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  9. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

随机推荐

  1. div的浮动、清除浮动和布局

    总结: 1.无序列表去除前面的小点点:list-style-type: none; 2.设置左浮动的间距. 外边距:margin :如果设定4个值就是,上右下左的顺序设置 如果设置3个值,那么左和右边 ...

  2. redis数据库学习笔记

    redis数据库 工作需要,简单了解一下redis数据库,供后续参考和复习使用. 一.简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字 ...

  3. 00.pip安装包

    pip安装更换镜像源 pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com pip导出和导入 ...

  4. Mysql - ORDER BY详解

    0 索引 1 概述 2 索引扫描排序和文件排序简介 3 索引扫描排序执行过程分析 4 文件排序 5 补充说明 6 参考资料 1 概述 MySQL有两种方式可以实现ORDER BY: 1.通过索引扫描生 ...

  5. (转)window.location.hash 属性使用说明

    location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...

  6. BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  7. 优雅到骨子里的Requests

    例子与特性 可以说Requests最大的特性就是其风格的简单直接优雅.无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格. 以下是一个简单例子: ...

  8. GlobalSign 增强型(EV) SSL 证书

    GlobalSign 增强型(EV) SSL 证书,属于最高验证级别的EV SSL,验证域名所有权,进行严格的企业真实身份验证,证书标识企业组织机构名称,强化信任度,浏览器地址栏变绿色.提供40位/5 ...

  9. 调用BPL包中的函数

    BPL就是一种DLL,DLL的EXPORTS和GETPROCADDRESS()在BPL中一样好使. 要调用BPL中的方法也和调用DLL的一样.代码略.

  10. Codeforces Round #390 (Div. 2) D. Fedor and coupons

    题意:题目简化了就是要给你n个区间,然后让你选出k个区间  使得这k个区间有公共交集:问这个公共交集最大能是多少,并且输出所选的k个区间.如果有多组答案,则输出任意一种.   这题是用优先队列来处理区 ...