一种录制Windows屏幕时实时绘制图形的方法技术领域
本发明涉及一种Windows电脑录屏录制技术,具体是一种在录制屏幕的同时录制
用鼠标进行的图形绘制的技术。
背景技术
在电脑屏幕上进行演示时,特别是要通过录屏软件将演示的操作录制成视频文件
时,经常需要在演示的屏幕上进行一些图形标注,比如绘制矩形框、箭头等对重点内容进行
突出显示。传统的录屏软件和技术对这个功能需求的解决方案是,在开始绘制图形的时候,
截取一张录制区域(或演示区域)的图片,将其平铺在录制区域上,并在这个图片上画图。这
样绘制的图像和绘制的过程就能被录制到或者演示到了。但这样的方式有一个明显的缺点
就是绘制过程中,屏幕的变化是看不到的,因为真正的屏幕背景被这张图片给挡住了。所以
这种传统的解决方案的屏幕不是“实时”显示的,无法反映出真正的屏幕内容,对录制和演
示的效果都有负面影响,需要改进。
发明内容
本发明的目的在于提供一种录制Windows屏幕时实时绘制图形的方法,以解决上
述背景技术中提出的问题。
为实现上述目的,本发明提供如下技术方案:
一种录制Windows屏幕时实时绘制图形的方法,包括如下步骤:(1)、在录屏过程中进入
绘制图形过程,此时程序监视鼠标的光标位置及鼠标的按键的状态;(2)、根据选定的图形
类型及鼠标的状态,创建出要绘制的图形,包括矩形、椭圆、直线、箭头、曲线、半透明蒙板、
文字;(3)、将创建出来的图形显示到电脑屏幕上;(4)、获取同时包含电脑屏幕的背景及绘
制的图形与图片;(5)、将获取到的图片转换为视频。
作为本发明的优选方案:步骤(1)是通过Windows系统的SetWindowsHookEx API函
数向系统注册鼠标钩子来获取鼠标的光标位置及按钮状态。
作为本发明的优选方案:步骤(2)的图形创建中,需要将图形绘制到一个背景透明
的32位Bitmap对象上,并根据步骤(1)获取的鼠标信息对图形位置、大小进行更新。
作为本发明的优选方案:步骤(3)的图形显示过程,是创建一个覆盖整个录制区域
的透明窗体,该窗体具有WS_EX_LAYERED的扩展属性,通过Windows的UpdateLayeredWindow
API函数来将步骤(2)中创建的图形显示到该窗口上。
作为本发明的优选方案:步骤(4)需要在规定时间间隔内重复地获取电脑屏幕及
绘制的图形,以实现屏幕背景和图形在最终生成的视频中的实时显示。
与现有技术相比,本发明的有益效果是:本发明可以在显示所绘制图形的过程和
结果时,不用遮挡当前演示和录制的屏幕区域,观察者能够看到当前屏幕背景的变化,于是
更加真实和完整地显示了当前屏幕的内容。
附图说明
图1为录制屏幕时实时绘制图形的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完
整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于
本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他
实施例,都属于本发明保护的范围。
请参阅图1,一种录制Windows屏幕时实时绘制图形的方法,包括如下步骤:(1)、在
录屏过程中进入绘制图形过程,此时程序监视鼠标的光标位置及鼠标的按键的状态;(2)、
根据选定的图形类型及鼠标的状态,创建出要绘制的图形,包括矩形、椭圆、直线、箭头、曲
线、半透明蒙板、文字;(3)、将创建出来的图形显示到电脑屏幕上;(4)、获取同时包含电脑
屏幕的背景及绘制的图形与图片;(5)、将获取到的图片转换为视频。
步骤(1)是通过Windows系统的SetWindowsHookEx API函数向系统注册鼠标钩子
来获取鼠标的光标位置及按钮状态。
步骤(2)的图形创建中,需要将图形绘制到一个背景透明的32位Bitmap对象上,并
根据步骤(1)获取的鼠标信息对图形位置、大小进行更新。
步骤(3)的图形显示过程,是创建一个覆盖整个录制区域的透明窗体,该窗体具有
WS_EX_LAYERED的扩展属性,通过Windows的UpdateLayeredWindow API函数来将步骤(2)中
创建的图形显示到该窗口上。
步骤(4)需要在规定时间间隔内重复地获取电脑屏幕及绘制的图形,以实现屏幕
背景和图形在最终生成的视频中的实时显示。
本发明的工作原理是:一种录制Windows屏幕时实时绘制图形的方法,包括如下步
骤:
(1)从在录屏过程中进入绘制图形过程,此时程序监视鼠标的光标位置及鼠标的按键
的状态(按下、放开)。通过Windows系统的SetWindowsHookEx API函数,注册一个全局的鼠
标钩子来监听鼠标事件。该事件的处理函数根据鼠标消息和鼠标位置,来进行下一步的处
理。鼠标事件处理核心过程如下:
开始
当 鼠标消息为左键按下 ,执行以下操作:
开始绘制图形
当 鼠标消息为左键放开,执行以下操作:
结束绘制图形
如果 鼠标左键按下了且鼠标位置变化了,执行以下操作:
改变图形的大小和位置
结束
本技术可以独占或者非独立鼠标消息。如果要独占鼠标消息,在鼠标事件处理程序中
不调用CallNextHookEx即可,这样可以在本次鼠标事件处理完成后,限制其它程序对鼠标
事件的响应。
(2)根据选定的绘制图形类型及鼠标的状态,创建出要绘制的图形,包括矩形、椭
圆、直线、箭头、曲线、半透明蒙板、文字等。具体的过程如下:
开始绘制图形:此时根据要绘制的图形,创建一个虚拟的图形对象,记录下该图形对象
的起始位置(即鼠标左键按下的位置)。如果是要创建文字图形,此时可能通过创建一个文
本输入框来让用户输入;并在再次点击左键时结束输入。
改变图形的大小和位置:鼠标的当前位置作为当前绘制的图形的终点位置生成图
形路径并更新显示。不同图形的生成方式可能各不相同。矩形、椭圆、直线和箭头只需起始
点和结束点就可以确定;曲线和半透明蒙板通过记录鼠标移动到的每一个点及设定的线条
宽度来生成。
结束绘制图形:此时完成正在绘制的图形对象,记录该图形的终点位置(即鼠标左
键放开的位置),从而确定该图形的形状、位置、大小等信息。
(3)将步骤(2)创建出来的图形显示到电脑屏幕上。这个过程主要分为以下两步:
将所有的图形绘制到内存中一个图片对象上,该图片对象必需是透明的,一般使用32
位的、ARGB格式的Bitmap即可。该图片的大小与录制区域的大小相同。绘制过程如下:
开始
当 图片对象不存在时,执行如下操作:
创建图片对象
当 图片对象的尺寸与录制区域(或演示区域)的尺寸不同时:
释放原图片对象,创建新的图片对象
清空图片对象的内容(只剩下透明的背景)
对于 创建的每一个图形,执行如下操作:
将图形绘制到图片对象上
在屏幕上显示该图片
结束
这个过程中只在图片对象不存在或者图片对象的尺寸与录制区域的尺寸不同时新建,
而不是每次都新建,会提升实际程序的运行效率。
通过一个透明的窗体,在屏幕上显示该图片。该窗体的位置和尺寸与录制区域的
位置和尺寸一致。该窗口具有WS_EX_LAYERED的扩展属性,这个属性可让该窗体显示为此前
绘制的图片。该窗口也具有WS_EX_TRANSPARENT的扩展属性,这个属性可让该窗口无视上面
的鼠标操作,用户可以透过该窗体在屏幕上进行操作。
通过Windows系统的 UpdateLayeredWindow API函数来将该图片在该窗体上显示
出来。由于图片在没有图形的部分是透明的,而且窗体本身是透明的、显示的是图片的内
容,所以没有图片的部分最终也是透明的,可看到窗体后面的屏幕内容。同时该窗体仅作显
示用,不影响用户操作,于是就实现了“实时”的图形绘制。
更新透明窗体是一个费时较多的过程,这里可以通过判断仅在图形有变化时更新
窗体,提高程序的运行效率。
(4)获取同时包含电脑屏幕的背景及绘制的图形的图片。由于当前创建的图形都
已经显示在屏幕上了,同时显示电脑中的其它操作和内容也能显示,可以通过定时截图来
获取电脑屏幕背景和绘制的图形,截图的时间间隔为(1000/帧率)毫秒。为了不影响之前步
骤的绘制图形的操作,优化程序性能,本步骤放到单独的进程或者线程中进行。具体过程如
下:
开始
如果 处于录制状态,执行如下操作:
创建一个格式兼容的、尺寸与录制区域相同的位图
将屏幕内容复制到位图中
处理该位图,写入视频文件中
等待 截图时间间隔
重复截图过程
结束
(5)将获取到的图片转换为视频。通过指定的视频编码器,即可将图片转换为视频。由
于这里可采用视频处理的一般通用技术,故本文中不详述。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在
不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论
从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权
利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有
变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包
含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当
将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员
可以理解的其他实施方式。