网上有不少录屏软件,可以将你的操作全部录制下来然后保存成SWF或者视频格式,用于教程制作非常方便。

    好象是去年的时候我用WMEncoder实现了一个。但WMEncoder有个严重的问题,就是一旦开始捕获后双击事件基本上就不能用了,所以我们经常看到的录屏软件应该不是基于这个实现的,应该是更底层的东西。前几天又有想法实现一个这样的软件,所以到网上找了下资料,发现根本找不着这方面的信息。所以自己猜想了下实现的方法。不过这两天又忙于另外一个东西了,所以这个想法还没有具体的实现。

    其实猜想的实现方法原理上很简单,这和视频文件的原理是有关的。众所周知,视频文件是以帧为播放单位的,这和最原始的电影胶片是一样的。在这里就不重复一遍电影的播放原理了。

    视频文件的格式一般都是一个头,然后加帧的列表的形式,而帧的数据最终肯定会被还原成一张位图,然后拷贝到显卡上进行显示。而这个过程是可逆的,也就是一张位图也是有方法转化成一种视频格式的帧(类似于解码器与编码器)那么我们不就可以每隔一断时间,截取当时整屏或者屏幕某块区域的位图(这个就简单多了,其实就是一个简单的截图而已)。然后将这个位图以及他的时间等信息存起来,这样当需要转化为某种格式时,只需将这些连续截取的图片构建成视频文件里连续的帧然后构造些头信息就可以了。当然这个间隔的设置,一般如果感觉不到卡的话为20毫秒,也就是0.02秒,因为人脑的反应速度就是这个。当然实际情况会比这个数要少,因为要考虑到机器的性能和你截屏以及保存的时间。 当然在实际处理的时候,你无须为每种格式都写一个构造器,只需实现一个最简单的,然后从网上找相应的格式转换的DLL就可以了。至于有些录屏软件上在鼠标点击的地方会出现一个提示(例如一个象瞄准镜的东西),你可以做一个全局系统钩子,记录下所有的事件及时间就可以了

补充:经过试验,截屏效率有些低,但勉强可以忍受,存取图片的速度实在是太慢了,另外还有一个问题就是光标问题,截屏光标是没办法显示的。

所以为了解决这些问题思路是这样设想的,

1.截屏效率问题  截屏还是要截的,毕竟不截屏的实现是不存在的,只是截屏的方式改改,直接从内存中或者显卡内存中拷贝的话,效率应该就不会成什么问题了。

2.存储慢的问题 这个直接存储在磁盘上就忽略了,先缓存在内存中,达到一定程度在使用另外另一个线程异步压缩存取到磁盘。

3.光标问题 在每次截屏(直接拷贝的方式)的时候记录当前光标位置以及光标类型及其它相关信息,转化成视频帧,手动在那个位置再画一个光标出来 

再补:查了些资料,微软提供了一个AVI的创建生成等的开发包 vfw (vfw32.lib) 截图后使用这个可以生成AVI文件

 

posted @ 2010-05-17 18:02 jivi 阅读(1362) 评论(2) 编辑

     用例实在是个很让人难以理解的东西,不同的书有不同的说法,看的越多就越糊涂,现在已经记不清是从哪本书里看到的概念了,就是用例是一系列没有明显时间中断的连续发生的事情,刚看到这个概念的时候那真是如获至宝,所以后来相当长的一段时间内,做需求写用例都是奔着这个目标去的,但慢慢问题就出来了,如果按着这个定义来,稍小的项目还可以,稍大一点的,光画用例图就够受的了,就不讲那一堆密密麻麻的用例,客户是否真的能看的清楚明白了。回过头来想想,当时对于这个概念的接受,说白了还是源于过重的程序员思维,因为这样的用例更容易映射到设计中去(主要是方便画顺序图)。一个没有明显时间中断的动集不就是一次人机交互嘛,执行者输入了什么,机器怎么处理的,返回给了执行者什么东西。按着这个思维写出这个用例的详细步骤,然后在设计阶段把这个详细步骤直接拿过来,结合一下领域模型大致提取一下对象,再给他们分配一下职责,再理一下关系,然后再把这些串起来,OK,一张初步的顺序图就出来了,这多方便啊。 

        当然话虽如此说,但并不代表着我就否定了上面的这种定义。上面的这种定义本身没有错,只是相对于某些项目来说,尤其是中型以上的,粒度过细了。经常有人把用例及其之后的业务建模比作是客户和设计之间的一座桥梁,我觉得这个比喻并不恰当,用例及业务建模并不能象桥梁那样把两端进行无缝的连接,充其量他只能算是立在两岸之间的一个木桩,他和两端都存在着一定的距离,于是问题就出现了,那就是这个木桩应该是靠客户更近些呢还是靠设计更近一些。这个问题我给不出准确的答案,但个人认为,应该更偏向于客户一方,因为,用例以及业务建模的主要目的还是获取更准确的需求,而要想获取更准确的需求,至少你的用例以及模型得让客户更容易理解,所以用例粒度以建业务模型主要依据还是客户的需要,而非设计人员或者程序人员的需要。故而用例的粒度并非必须达到“一系列没有明显时间中断的动作集”这样的细粒度,那么粒度究竟多大为宜呢,这我也说不准,不仅说不准,实际操作中也很拿捏的准,这和客户的理解能力,客户的配合度,个人的交流能力以及项目经理给你分配的需求调研的时间都是息息相关的。所以用例的粒度怎么界定这东西实在是让人很头痛的一件事,看书也是废的,最终还得实际情况实际对待  

     本来这篇文字的名字叫关于用例的理解的,但写完后,再回头看一遍后发现竟然和原来看用例方面的书一样,越看越迷茫了。于是乎将名字改为关于用例的废话了     

     短短的这一点字,竟然写了我一个多小时了,这也太废时间了,突然发觉那些写文章共享的人的实在是太伟大了。

  

posted @ 2009-12-10 02:13 jivi 阅读(1323) 评论(8) 编辑
看到这样的题目。可能大部分人已经张口开骂了。操作系统谁不会安装。还用的着你在这里讲。
如果你这样想的话,那你就大错特错了。其实还是有很大一部分人并不知道操作系统是怎么安装的。因为此‘怎么安装’非彼‘怎么安装’也。
也许在你的脑子里理解的安装操作系统就是把系统盘放进光驱里,设置下CMOS使之从光驱启动,然后按照操作系统的提示一步一步把操作系统安装起来。
当然在这里我肯定不会去讲这方面的内容。我要讲的是,当你把系统盘放进光驱之前或者之后计算机内部做了些什么事情。
posted @ 2009-08-22 15:16 jivi 阅读(118) 评论(2) 编辑
      其实有很多人对逆向有相当大的误解,一提到逆向。就将他和破解联系到了一起。
其实这是一种误读。破解是非法的(在中国讲这话,有点雷人了)。
但逆向不是。当然破解也是需要很多逆向知识的。
但逆向却不仅仅只是破解。可以讲,破解只是逆向的入门。  
进行逆向工程所要掌握的知识可不是实现一个破解所要掌握的知识所能比拟的。
虽然逆向工程并不是一个很容易入门的学问。
但我个人认为。作为一名搞程序的人。如果想要通向'真正的高手'之路。
学会逆向却是必不可少的。当然这也仅仅只是万里长征的第一步而已。
      对着文档。写几个例子,或者弄几个偏门语法分析分析性能。
那纯粹是哗众取宠,哄哄小孩子倒是可以。
当然 
      虽然这样说,但我并不讽刺那些写例子的人。相反,对于这些作者我是持尊重态度的。
对于众多的初学者,他们的文章无疑就是指路明灯。其实仔细想想。
我们这些搞程序的人,又有哪一个不是从读这样的文章中一路走过来的呢。
说实话。一直以来我都想写写这方面的文章。说说自己当初遇到的困难及解决的方法。
这样也能给后来者指指路。但是每次都胎死腹中。因为想想还是觉得写这个太烦了。
故而我觉得写这方面文章的人是无私的是奉献的。
      但对于那些天天研究偏门语法的。在我看来。纯粹就是没事找事做。闲的蛋疼。
貌似高深。其实什么都不是
      废话少说,入正题。为什么讲逆向是通向'真正的高手'的必由之路呢。
原因很简单。因为逆向是窥探软件内部秘密的终极武器。
尤其是对于那些无正式文献或者非开源的软件更是唯一的武器。
      你查一辈子文档。只能算是一个读过很多文档的程序员。个中几个运用比较好的。
勉强能挤入相对意义的高手境界。为什么呢。因为文档不会告诉你解决问题的思路。
更不可能完完整整的告诉你怎么去解决一个实际的问题。
甚至有些解决问题的关键点根本不会出现在文档里。
       当然如果到现在你都没遇到过在网络上找不到答案或者很难找到答案的难题。
那只能说明你在从事造轮子的工作。当然大部分人都是这样。这本无可厚非.
但如果真遇到这样的问题该怎么办。直接问开发者?这个难度可不小。第一。你怎么
得到他的联系方式。第二。你问他。你认为他会告诉你。第三。如果再是外国人写的。
那语言关可也不是那么好过的。
      那么究竟怎么办呢。最直接的办法。当然是逆向。前些日子。我写了个虚拟光驱的例子。
当时准备实现的时候。在网上是遍查资料最终却是一无所得。故而只有逆向了。于是选了一款
功能相对单一体积相对较小的软件逆了一下。分析了他的实现思路。用c#实现了应用层的程序。
尽管驱动层使用的源码是在网上搜到的程序的基础上改动过来的。
但那也是在分析完驱动程序。得到了相关知识的基础上。才搜索出来的。       
另外目前公司的一个项目中有些技术难点也是从逆向别人的程序中获得的思路和解决方案。
winmount的作者大牛刘涛涛也曾在他的一篇文章里写到。winmount实现过程中的一些技术难点。
也是从逆向中获得的解决方案。
当然逆向并不是万能的。他仅能告诉你这个功能怎么实现(也视能力而定)。
不能告诉你怎么更好的去实现 。这个层面就是设计要解决的问题了。
但是如果你是一个连很多东西都做不出来的程序员。那又何来高手之谈呢。
        
posted @ 2009-08-09 20:56 jivi 阅读(480) 评论(16) 编辑

你这两天老是看到象 你真的了解“×××”这样的题目。虽然编程多年,但如果你
真让我讲对“×××”真的了解吗?我还真不敢确定。于是满怀激动的打开链接。
进去后,却是郁闷异常。
文章里大多数的内容说白了就是作者重新用自己的话将教科书上的东西又说了一遍。
有的更绝,直接Ctrl+c,Ctrl+v.
当然我也并不是反对这样的文章的存在。反而觉得这样的文章的存在是件好事。
可以给初学者指点路。但不要动不动就冠以 什么 你真的了解“×××”这样的题目。
搞的好象。如果你不听我把教科书上的东西重新讲一遍。你就对“×××”不了解一样。
即便你在描述的过程中加入了自己的理解。那也是你自己的理解。充其量取个
“×××”之我见的题目。这年头流行炒作。难道技术的分享也需要这样???
那我就得问问你 你真的了解“真的了解”的含义吗   

posted @ 2009-08-07 00:52 jivi 阅读(224) 评论(5) 编辑
摘要: (原来写在CSDN上的,先转过来一份.要不然开了博不写点东西。总感觉是浪费哈)用c#实现的虚拟光驱的源代码(使用了minicd.sys)驱动部分未重新实现代码有点乱。凑合着看吧 一直以来对虚拟光驱的实现都很好奇,也曾想试着做一个,但查遍网上资料,基本上没找到过什么有用的。所以一直没有实现。感于这方面资料的缺少。所以准备研究一下这方面的技术。 在没有什么资料的情况下,要想研究某方面的技术,最好的办法...阅读全文
posted @ 2009-08-06 17:38 jivi 阅读(521) 评论(0) 编辑