一种屏幕获取方法及系统与流程

文档序号:11133592阅读:501来源:国知局
一种屏幕获取方法及系统与制造工艺

本发明涉及计算机图像处理技术领域,尤其涉及一种屏幕获取方法及系统。



背景技术:

随着科技的发展,用户通过各种软件应用进行交互的场合越来越多。用户可以通过各种交互渠道与好友分享信息。如游戏玩家希望能够在玩游戏的过程中与好友分享精彩瞬间,此时就需要对当前游戏界面进行截图操作。现有的屏幕获取方法,例如系统自带的PrScrnSysRq(打印屏幕系统请求),是直接获取当前屏幕上全部画面,腾讯的截图工具无法截取被遮挡的窗口画面,当需要被截图的窗口部分被其它窗口遮挡时,无法只截取指定窗口中的画面。

申请号为201010270354.X的专利文献公开一种计算机屏幕截取方法及其系统,通过捕捉GDI图像;获取Driect3D数据窗口的窗口句柄,根据所述窗口句柄创建跟踪窗口,并设置所述跟踪窗口跟踪所述Driect3D数据窗口在计算机显示画面中的位置和剪裁区域;捕捉所述Driect3D数据窗口的图像;根据所述跟踪窗口记录的剪裁区域对所述Driect3D数据窗口的图像进行剪裁;根据所述跟踪窗口的位置将剪裁后的所述Driect3D数据窗口的图像与所述GDI图像合成。

虽然上述专利文献提供的方案可实现截取指定窗口中的画面,但是在设备启动时就要将相应的屏幕截取模块注入到进程当中,无法做到随时注入随时获取。然而,游戏玩家先重启游戏再截取屏幕就会错过精彩瞬间。



技术实现要素:

本发明所要解决的技术问题是:提供一种屏幕获取方法及系统,实现无需重启待截图画面所在窗口的进程即可截取指定窗口的画面。

为了解决上述技术问题,本发明采用的技术方案为:

本发明提供一种屏幕获取方法,包括:

获取截图指令;

加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

所述截图模块创建渲染设备;

获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

设置所述显示函数的函数指针指向所述第二地址;

设置所述第一函数的函数指针指向所述第一地址;

执行所述显示函数,获取截取画面。

本发明还提供一种屏幕获取系统,包括:

第一获取模块,用于获取截图指令;

加载模块,用于加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

第一创建模块,用于所述截图模块创建渲染设备;

第二获取模块,用于获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设模块,用于预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

第一设置模块,用于设置所述显示函数的函数指针指向所述第二地址;

第二设置模块,用于设置所述第一函数的函数指针指向所述第一地址;

执行模块,用于执行所述显示函数,获取截取画面。

本发明的有益效果在于:当获取截图指令后,才加载截图模块执行截图操作,实现无需重启待截图画面所在窗口的进程即可执行相应的截图操作;通过拦截显示函数,并在执行显示函数之前先执行截图操作,实现显示函数在将下一帧画面显示在屏幕上之前可先截取已显示在屏幕上的当前画面;通过将截图模块注入到待截取画面所在窗口的进程中,实现截取的画面为待截取画面所在窗口中的内容,不受其它窗口遮挡影响。

附图说明

图1为本发明一种屏幕获取方法的流程框图;

图2为本发明一种屏幕获取系统的结构框图;

图3为本发明另一种屏幕获取系统的结构框图;

标号说明:

1、第一获取模块;2、加载模块;3、第一创建模块;4、第二获取模块;5、预设模块;6、第一设置模块;7、第二设置模块;8、执行模块;9、第三设置模块;10、第三获取模块;11、截取模块;12、第四获取模块;13、调用模块;14、监控模块;15、发送模块;16、第二创建模块;17、第三创建模块;18、第四创建模块;19、第四设置模块;20、第五设置模块;21、清理模块。

具体实施方式

为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。

本发明最关键的构思在于:通过当获取截图指令后,将截图模块注入到待截取画面所在窗口的进程中,实现无需重启待截图画面所在窗口的进程即可截取指定窗口的画面。

请参照图1至图3所示:

如图1所示,本发明提供一种屏幕获取方法,包括:

获取截图指令;

加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

所述截图模块创建渲染设备;

获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

设置所述显示函数的函数指针指向所述第二地址;

设置所述第一函数的函数指针指向所述第一地址;

执行所述显示函数,获取截取画面。

DirectX通常作为开发游戏程序的工具,使用DirectX提供的函数Present可实现将后台绘制好的画面显示到当前界面上。通过HOOK技术挂钩函数Present,当系统调用函数Present显示下一帧画面时,拦截该函数并转向截图模块中自定义的第一函数。第一函数先截取当前界面显示的画面,再执行函数Present的函数体,显示下一帧画面。由于截图模块已注入待截取画面所在窗口的进程,因此函数Present显示的画面均为该进程的窗口画面,不会受其它遮挡窗口的影响。且当获取截图指令时才注入截图模块,可实现随时注入随时执行截图操作。

进一步地,所述截取窗口画面具体为:

设置截图起始坐标、截图长度和截图宽度;

获取与所述截图起始坐标、截图长度和截图宽度相对应的区域,得到截图区域;

截取所述截图区域的画面。

由上述描述可知,可实现截取用户指定区域的画面。

进一步地,所述执行显示函数的函数体,具体为:

获取所述第一函数的函数指针指向的入口地址,得到第三地址;

通过所述第三地址调用所述显示函数。

由上述描述可知,可实现正确地执行显示函数的函数体。

由于第一函数和显示函数的函数指针所指向的入口地址进行了调换,此时显示函数的函数指针所指向的入口地址实际为第一函数的入口地址,若直接通过函数名调用显示函数无法执行显示函数实际的函数体。由于此时第一函数的函数指针指向的入口地址为显示函数的入口地址,因此,需先获得第一函数的函数指针指向的入口地址,再通过该入口地址调用显示函数,执行显示函数的函数体。

进一步地,所述获取截图指令之前,还包括:

监控截图快捷键或截图控件;

当触发所述截图快捷键或截图控件时,发送截图指令。

由上述描述可知,可实现监控截图快捷键或截图控件,及时获知用户的截图需求。

进一步地,所述截图模块创建渲染设备,具体为:

创建第一窗口;

在所述第一窗口上创建画图接口;

使用所述画图接口中的创建渲染设备函数创建渲染设备。

由上述描述可知,通过模拟DirectX创建流程创建渲染设备,实现无需重启待截图画面所在窗口的进程即可注入截图模块。

优选地,使用CreateWindow函数创建一个窗口,使用Direct3DCreate9函数创建DirectX9接口,使用CreateDevice函数创建DirectX9渲染设备。

进一步地,执行所述显示函数,获取截取画面之后,还包括:

设置所述显示函数的函数指针指向所述第一地址;

设置所述第一函数的函数指针指向所述第二地址;

释放所述渲染设备,销毁所述第一窗口。

由上述描述可知,实现恢复显示函数和第一函数的函数指针所指向的地址,使得截图操作执行完毕后不影响显示函数的正常运行。

如图2所示,本发明还提供一种屏幕获取系统,包括:

第一获取模块1,用于获取截图指令;

加载模块2,用于加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

第一创建模块3,用于所述截图模块创建渲染设备;

第二获取模块4,用于获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设模块5,用于预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

第一设置模块6,用于设置所述显示函数的函数指针指向所述第二地址;

第二设置模块7,用于设置所述第一函数的函数指针指向所述第一地址;

执行模块8,用于执行所述显示函数,获取截取画面。

进一步地,如图3所示,还包括:

第三设置模块9,用于设置截图起始坐标、截图长度和截图宽度;

第三获取模块10,用于获取与所述截图起始坐标、截图长度和截图宽度相对应的区域,得到截图区域;

截取模块11,用于截取所述截图区域的画面。

进一步地,如图3所示,所述执行模块8,包括:

第四获取模块12,用于获取所述第一函数的函数指针指向的入口地址,得到第三地址;

调用模块13,用于通过所述第三地址调用所述显示函数。

进一步地,如图3所示,还包括:

监控模块14,用于监控截图快捷键或截图控件;

发送模块15,用于当触发所述截图快捷键或截图控件时,发送截图指令;

第二创建模块16,用于创建第一窗口;

第三创建模块17,用于在所述第一窗口上创建画图接口;

第四创建模块18,用于使用所述画图接口中的创建渲染设备函数创建渲染设备;

第四设置模块19,用于设置所述显示函数的函数指针指向所述第一地址;

第五设置模块20,用于设置所述第一函数的函数指针指向所述第二地址;

清理模块21,用于释放所述渲染设备,销毁所述第一窗口。

本发明的实施例一为:

监控截图快捷键或截图控件;

当触发所述截图快捷键或截图控件时,发送截图指令;

获取截图指令;

加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

创建第一窗口;

在所述第一窗口上创建画图接口;

使用所述画图接口中的创建渲染设备函数创建渲染设备;

获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

设置所述显示函数的函数指针指向所述第二地址;

设置所述第一函数的函数指针指向所述第一地址;

执行所述显示函数,由于此时所述显示函数的函数指针所指向的地址为第一函数的入口地址,因此,实际执行的是第一函数的函数体;

设置截图起始坐标、截图长度和截图宽度;

获取与所述截图起始坐标、截图长度和截图宽度相对应的区域,得到截图区域;

截取所述截图区域的画面;

获取所述第一函数的函数指针指向的入口地址,得到第三地址;

通过所述第三地址调用所述显示函数;

设置所述显示函数的函数指针指向所述第一地址;

设置所述第一函数的函数指针指向所述第二地址;

释放所述渲染设备,销毁所述第一窗口。

本发明的实施例二为:

监控截图快捷键F10,当用户按下F10时,向待截图画面所在窗口的进程发送截图指令。所述进程获取截图指令后,加载截图模块。所述截图模块模拟DirectX的创建流程创建渲染设备,具体为:使用CreateWindow函数创建一个窗口,使用Direct3DCreate9函数创建DirectX9接口,使用CreateDevice函数创建DirectX9渲染设备。获取所述渲染设备中的显示函数Present的入口地址,得到第一地址,所述显示函数Present用于将后台绘制好的画面显示在当前界面上,预设第一函数,获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数Present的函数体,使用HOOK技术挂钩显示函数Present,当系统调用显示函数Present时,自动转向执行第一函数。第一函数获取用户设置的截图起始坐标、截图长度和截图宽度,获取与所述截图起始坐标、截图长度和截图宽度相对应的区域,得到截图区域,截取所述截图区域的画面。获取第一函数的函数指针指向的入口地址,得到第三地址,通过所述第三地址调用所述显示函数Present,将后台绘制好的下一帧画面显示到当前界面上。撤销在显示函数Present上挂钩第一函数,释放所述渲染设备,销毁所述第一窗口。

本发明的实施例三为:

监控模块14监控截图快捷键或截图控件;

发送模块15当触发所述截图快捷键或截图控件时,发送截图指令;

第一获取模块1获取截图指令;

加载模块2加载截图模块至进程;所述进程为待截图画面所在窗口的进程;

第二创建模块16创建第一窗口;

第三创建模块17在所述第一窗口上创建画图接口;

第三创建模块3调用第四创建模块18使用所述画图接口中的创建渲染设备函数创建渲染设备;

第二获取模块4获取所述渲染设备中的显示函数的入口地址,得到第一地址;所述显示函数用于将后台绘制好的画面显示在当前界面上;

预设模块5预设第一函数;获取所述第一函数的入口地址,得到第二地址;所述第一函数用于截取窗口画面和执行显示函数的函数体;

第一设置模块6设置所述显示函数的函数指针指向所述第二地址;

第二设置模块7设置所述第一函数的函数指针指向所述第一地址;

执行模块8执行所述显示函数,获取截取画面;

第三设置模块9设置截图起始坐标、截图长度和截图宽度;

第三获取模块10获取与所述截图起始坐标、截图长度和截图宽度相对应的区域,得到截图区域;

截取模块11截取所述截图区域的画面;

第四获取模块12获取所述第一函数的函数指针指向的入口地址,得到第三地址;

调用模块13通过所述第三地址调用所述显示函数;

第四设置模块19设置所述显示函数的函数指针指向所述第一地址;

第五设置模块20设置所述第一函数的函数指针指向所述第二地址;

清理模块21,用于释放所述渲染设备,销毁所述第一窗口。

综上所述,本发明提供的屏幕获取方法及系统,通过当获取截图指令后,才加载截图模块执行截图操作,实现无需重启待截图画面所在窗口的进程即可执行相应的截图操作;通过拦截显示函数,并在执行显示函数之前先执行截图操作,实现显示函数在将下一帧画面显示在屏幕上之前可先截取已显示在屏幕上的当前画面;通过将截图模块注入到待截取画面所在窗口的进程中,实现截取的画面为待截取画面所在窗口中的内容,不受其它窗口遮挡影响;进一步地,可实现截取用户指定区域的画面;进一步地,可实现正确地执行显示函数的函数体;进一步地,可实现监控截图快捷键或截图控件,及时获知用户的截图需求;进一步地,实现无需重启待截图画面所在窗口的进程即可注入截图模块;进一步地,实现恢复显示函数和第一函数的函数指针所指向的地址,使得截图操作执行完毕后不影响显示函数的正常运行。

以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1