一种截图方法,及装置制造方法
【专利摘要】本发明实施例公开了一种截图方法,及装置,本发明实施例方法包括:在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;若有,则向所述显示功能的模块注入全局钩子;在接收到截图指令后,通过全局钩子进行截图。以上方案,在确定具有图像显示功能的模块被目标软件所加载后,向显示功能的模块注入全局钩子,通过局钩子进行截图,在实现截图的过程中可以不影响被截图软件进程,提高截图方案的应用范围,并且简单智能。并且可以仅截取被截图软件相关的图像内容避免其它例如背景元素的截入,方便快捷。
【专利说明】—种截图方法,及装置
【技术领域】
[0001]本发明涉及软件【技术领域】,特别涉及一种截图方法,及装置。
【背景技术】
[0002]近年来,随着我国互联网产业的不断进步,个人电脑、智能终端等设备的普及率越来越高,用户对设备的应用需求也多种多样。一些软件在运行过程中会有各种图像显示,用户时常需要截取这些图像,这类图像截取的的需求也越来越广泛。
[0003]以下软件以网络游戏软件为例进行需求性说明,需要说明的是:本发明实施例中的软件可以是在运行过程中有图像显示的任意软件,并不限于网络游戏软件。
[0004]目前网络游戏产业呈现快速稳定的发展态势,不仅形成日渐完善的产业链和相对成熟的产业发展环境,而且本土原创网络游戏在实现由量变到质变跨越。网络游戏在游戏品种、数量、题材类型、市场规模和从业人员数量等方面,都实现了持续快速的增长。由单一大型多人在线到网页游戏、社区游戏、手机网游等新品种不断的涌现。网络游戏强调多人同时登录服务器共同赚取在线经验,因此在用户之间经验分享的需求就变得很突出。在游戏过程中快速、简单、智能,并且不影响游戏进程的情况下截图得到照片并将照片分享出去,则能够使用户在玩网络游戏的同时便捷的与周围的人分享网络游戏的经验与乐趣,同时不对游戏过程产生干扰,保持了游戏原有的用户体验。
[0005]发明人在实现本发明实施例的过程中发现:目前针对软件截图的方案主要有两类,一类是软件本身自带截图的功能,但是这类截图方案大部分都是针对当前软件自身的,与该软件自身的结构密切相关,缺乏广泛的应用场景因此具有一定的局限性。另外一类是软件自身并不提供截图的功能,用户为了实现截图这个应用需求采用第三方的截图软件进行截图,由于目前的截图软件功能单一而且并针对被截图软件专门设计的,会对被截图软件的进程产生干扰,因此也存在一定的局限性。综上所述,目前的截图方案无法实现快速、简单、智能在不影响被截图软件进程的前提下截图,应用范围存在局限。
【发明内容】
[0006]本发明实施例提供了一种截图方法,及装置,用于实现快速、简单、智能在不影响被截图软件进程的前提下截图,提高截图方案的应用范围,并且简单智能,实现快速简单智能的截图。
[0007]—种截图方法,包括:
[0008]在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;若有,则向所述显示功能的模块注入全局钩子;
[0009]在接收到截图指令后,通过全局钩子进行截图。
[0010]一种截图装置,包括:
[0011]加载确定单元,用于在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;[0012]钩子注入单元,用于若加载确定单元确定结果为有,则向所述显示功能的模块注入全局钩子;
[0013]指令接收单元,用于接收截图指令;
[0014]截图执行单元,用于在指令接收单元接收到截图指令后,通过全局钩子进行截图。
[0015]从以上技术方案可以看出,本发明实施例具有以下优点:在确定具有图像显示功能的模块被目标软件所加载后,向显示功能的模块注入全局钩子,通过局钩子进行截图,在实现截图的过程中可以不影响被截图软件进程,提高截图方案的应用范围,并且简单智能。并且可以仅截取被截图软件相关的图像内容避免其它例如背景元素的截入,方便快捷。
【专利附图】
【附图说明】
[0016]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0017]图1为本发明实施例方法流程示意图;
[0018]图2为本发明实施例另一方法流程示意图;
[0019]图3为本发明实施例装置结构示意图;
[0020]图4为本发明实施例装置结构示意图;
[0021]图5为本发明实施例装置结构示意图;
[0022]图6为本发明实施例装置结构示意图;
[0023]图7为本发明实施例装置结构示意图。
【具体实施方式】
[0024]为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0025]本发明实施例提供了一种截图方法,如图1所示,包括:
[0026]101:在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;若有,则向上述显示功能的模块注入全局钩子;
[0027]以游戏软件为例,目前市面上绝大多数的网络游戏都是使用DirectX (Directextension,多媒体编程接口)技术进行图像显示,由C++编程语言实现,遵循COM (组件对象模型),被广泛应用于各种图像处理软件的的开发。DirectX是这样一组技术:旨在使基于计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、三维(3D)动画和丰富音频)的应用程序的理想平台。DirectX是由很多APKApplication Programming Interface,应用程序编程接口)组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。本实施例可以针对在网络游戏中占有重要比重的DirectX中的显示部分,分为DirectDraw (Ddraw, DirectX中的关于视频输入输出的基本部分)和Direct3D(D3D,显示程序接口),前者主要负责二维(2D)图像加速,后者则主要负责3D效果的显示,比如各种3D画面中的场景和人物等,都是使用了 DirectX的Direct3D。如果目标软件是基于DirectX的,那么上述确定是否有具有图像显示功能的模块被目标软件所加载,则可以确定是否有D3D8.dll或者D3D9.dll等模块被游戏主函数加载。如果有,则可以确定此启动的游戏是用DirectX技术进行图像界面的渲染的。
[0028]如果没有图像显示功能的模块被目标软件所加载,那么要么没有图像显示不需要进行截图,要么就是本实施例方案还不支持这种目标软件的截图,会导致截图失败,对于没有图像显示功能的模块被目标软件所加载的情况,本发明实施例不予限定。
[0029]对目标软件进行全局钩子的注入,一般可以通过操作系统实现,具体注入过程本发明实施例不予限定。
[0030]102:在接收到截图指令后,通过全局钩子进行截图。
[0031]以上实现方案,在确定具有图像显示功能的模块被目标软件所加载后,向显示功能的模块注入全局钩子,通过局钩子进行截图,在实现截图的过程中可以不影响被截图软件进程,提高截图方案的应用范围,并且简单智能。并且可以仅截取被截图软件相关的图像内容避免其它例如背景元素的截入,方便快捷。
[0032]更具体地,本发明实施例给出了适应于DirectX的截图具体实现方式,上述在接收到截图指令后,通过全局钩子进行截图包括:通过全局钩子获取图像显示功能模块的输出的图像,并将图像发送给应用程序编程接口,进行图像显示;若接收到截图指令,则截取通过全局钩子获取到的当前的图像。
[0033]进一步地,本发明实施例为了保证截图时先执行截图逻辑然后执行目标软件相关图像的显示,达到及时准确的截图,本发明实施例给出了如下解决方案:在向上述显示功能的模块注入全局钩子之后还包括:将目标软件的的主函数中标记为有截图进程加载了上述主函数。
[0034]更具体地,本发明实施例还给出了使用库函数钩子(Hook)的具体实现方式:上述通过全局钩子获取图像显示功能模块的输出的图像包括:通过全局钩子,确定目标函数,并通过目标函数的替代函数分配新内存,然后拷贝目标函数的图像数据到上述新内存;上述当前的图像为接收到截图指令时,上述新内存中的图像。
[0035]进一步地,本发明实施例还给出了使用前述截图方案并且不影响目标软件相关图像显示的具体实现方案:上述通过目标函数的替代函数分配新内存之前还包括:通过全局钩子,确定将要拦截的目标函数的函数地址,并复制上述函数地址的目标函数;上述将图像发送给应用程序编程接口,进行图像显示包括:在拷贝目标函数的图像数据到上述新内存之后,退出上述替代函数,恢复复制的上述目标函数并运行。
[0036]优选地,上述替代函数为:新编写的开发库函数。使用开发库函数可以实现与操作系统的平滑对接,提高兼容性。
[0037]优选地,由于运行目标软件所采用的操作系统可能存在差异,本发明实施例还给出了解决因这种差异可能导致确定目标函数的地址可能出现的错误的具体实现方式:上述确定将要拦截的目标函数的函数地址包括:利用编程接口 DirectX提供的应用程序编程接口 API函数,创建用于图像显示的接口 API函数的接口对象;利用上述接口对象导出显示程序接口的设备对象,并依据设备对象的虚函数表的首地址,以及API函数的导出函数的位置确定目标函数的函数地址。[0038]以上实施例,给出了在接收到截图指令后,通过全局钩子进行截图的各种实现方式的举例,后续实施例中目标软件将以网络游戏为例进行更详细的举例说明。
[0039]进一步地,本发明实施例还给出了按需截图的具体实现方式,在截图完成后还包括:按照用户指令将截图得到的图像数据转换为上述用户指令指定规格参数的图像。
[0040]进一步地,本发明实施例还给出了按需截图以后的使用实现方式举例,上述方法还包括:将用户指令指定规格参数的图像,发送至用户指令指定的地址。上述指定的地址可以微博、网络空间、博客等各种表现形式的地址,对于具体的地址表现形式本发明实施例不予限定。
[0041]以下实施例将目标软件将以网络游戏为例进行更详细的举例说明,主要分为四个部分:一、网络游戏的识别,二、游戏界面的截取,三、生成游戏屏幕截图并快速分享,四、截图流程综述。
[0042]一、网络游戏的识别
[0043]以游戏软件为例,目前市面上绝大多数的网络游戏都是使用DirectX (Directextension,多媒体编程接口)技术进行图像显示,由C++编程语言实现,遵循COM(组件对象模型),被广泛应用于各种图像处理软件的的开发。DirectX是这样一组技术:旨在使基于计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、三维(3D)动画和丰富音频)的应用程序的理想平台。DirectX是由很多APKApplication Programming Interface,应用程序编程接口)组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。本实施例可以针对在网络游戏中占有重要比重的DirectX中的显示部分,分为DirectDraw (Ddraw, DirectX中的关于视频输入输出的基本部分)和Direct3D(D3D,显示程序接口),前者主要负责二维(2D)图像加速,后者则主要负责3D效果的显示,比如各种3D画面中的场景和人物等,都是使用了 DirectX的Direct3D。如果目标软件是基于DirectX的,那么上述确定是否有具有图像显示功能的模块被目标软件所加载,则可以确定是否有D3D8.dll或者D3D9.dll等模块被游戏主函数加载。如果有,则可以确定此启动的游戏是用DirectX技术进行图像界面的渲染的。
[0044]本发明实施例中的截图进程在游戏启动的时候会对游戏中加载的显示模块(SP:具有图像显示功能的模块)进行鉴别,如果含有D3D8.dll或者D3D9.dll等模块被游戏主函数加载,就可以判定此启动的游戏是用DirectX技术进行图像界面的渲染的,这时就可以启动截图进程,如果无法检测到这两个模块的加载,此时截图进程就可以立即退出,达到智能识别网络游戏的目的。
[0045]二、游戏界面的截取
[0046]当完成前一步网络游戏的识别以后,截图进程已经在后台启动并运行,截图进程的主要工作原理是采用视窗操作系统的钩子(hook)机制,在截图进程随着网络游戏软件启动的过程中会向游戏软件的进程中的显示模块,例如:D3D8.dll或者D3D9.dll进行hook注入,本发明实施例可以采用WH_CBT类型的全局钩子,在游戏进程启动的时候视窗操作系统会把包含全局钩子的dll (Dynamic Link Library,动态链接库)向所有运行的进程进行注入,这就可以保证照相功能的子进程能顺利进入游戏进程。包含全局钩子的dll在注入到游戏进程后,需要在注入的时候可先执行截图功能的逻辑(简称为:截图逻辑),因此技术实现上本发明将截图逻辑的函数加入到dll开始执行时,即入口函数dll main (dll的主函数)中标记为DLL_PROCESS_ATTACH (当进程加载DLL文件的时候传这个参数,表示有进程加载了该DLL)的逻辑内,保证游戏在界面显示的时候先执行钩子里边的截图逻辑。
[0047]在使用DirectX进行显示的游戏中,游戏动态效果的展现采用的是逐帧显示的方式,这种逐帧显示的效果靠D3D8.dll或者D3D9.dll中的API函数来提供,如果能在游戏界面显示之前先截获到图像数据,然后把图像数据在内存中拷贝一份,最后再将图像数据原封不动的送还给DirectX的API就能实现不影响游戏流畅性的前提下截取游戏画面的目的。为了达到Hook游戏进程DirectX的API函数的目的,本发明实施例采用了 Hook开发库Detour,使用Detour库Hook的步骤主要是完成以下四步:
[0048](I)、确定要拦截的目标(Target)函数的函数地址,即函数指针;该目标函数即为要Hook的API函数;
[0049](2)、因为开发库会修改目标函数(Detour将会改写Target函数),可以先编写Target函数的复制品,把Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复;
[0050](3)、编写Detour函数用来替代Target函数的函数,分配一块全新的内存拷贝图像数据到新分配的内存;
[0051](4)、在拷贝游戏图像数据完成以后,Detour函数立即退出,恢复Target函数的复制品保证游戏显示进程的正常运行。
[0052]关于步骤(I)中获得Target函数的函数地址(即:函数的导出地址),一般的实现方式可以是采用LoadLibrary (LoadLibrary:载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源)的方式根据Target函数的名称用标准的视窗操作系统的API函数GetProcAddress (GetProcAddress:用于获得一个dll的某个导出函数),用于调用某一 dll的功能获取,但是在实际的使用当中发明人发现这种方式在某些视窗操作系统系统上会获取错误的函数地址,导致无法Hook到对应D3D8.dll或者D3D9.dll的API,但是由于国内的视窗操作系统用户使用数据巨大,因此为了截图的有效性本发明实施例可以采用计算函数偏移量的方式来保证能够准确的获取对应的函数地址。具体过程简述如下:
[0053](1.1)、首先利用DirectX提供的API函数创建IDirect3D9或者IDirect3D8的接口对象;
[0054](1.2)、利用上述接口对象的导出函数CreateDevice创建D3D的设备对象,此对象包含数据显示的功能;
[0055](1.3)、获取设备对象的虚函数表的首地址,根据D3D8.h或者D3D9.h给出的导出函数的位置获取需要拦截的Target函数的地址。IDirect3D9、IDirect3D8、CreateDevice、D3D8.h、D3D9.h ;均是游戏开发相关的用于图像显示的接口 API函数。
[0056]完成上述使用Detour库Hook的四个步骤以后,技术上就实现了在游戏显示进程中用Detour函数拦截D3D8.dll或者D3D9.dll中的Target函数的功能。在实际的运行过程中发明人发现通过Detour函数Hook的方式虽然在游戏界面显示之前分配了一块内存并执行了拷贝,但是对游戏的进程影响几乎可以忽略,用户基本感觉不到游戏有卡或者拖尾的现象产生,因此仍然可以保证游戏的流畅运行。
[0057]三、生成游戏屏幕截图并快速分享[0058]在第二个部分中,由于利用Detours函数Hook到D3D8.dll或者D3D9.dll以后,已经将用户需要的游戏界面的截图数据拷贝到指定的内存空间中,根据DirectX的技术文档,此截图数据是仅仅包含像素信息的原始数据,为了能让用户直观的看到可以让这些数据转化成按照一定格式的图像格式,截图进程可以默认将游戏截图格式转化成DIB(DeviceIndependent Bitmap,设备无关位图)的类型的bmp (BitMaP,—种位图格式)图像,用户也可以根据自己的喜欢在设置里边选择保存图片的类型和保存的路径。保存好的图片用户可以将其分享到微博或者空间等SNS (Social Networking Services,社会性网络服务)应用,以便可以跟好友分享自己的游戏经验。
[0059]四、截图流程综述,如图2所示包括:
[0060]201:启动游戏进程;在用户启动游戏进程后,确定是否有D3D模块被加载,本步骤可以按照截图模块启动的规则判断游戏的显示模块是否含有DirectX的D3D模块,如果没有侦测到则截图模块退出,如果有,进入202。
[0061]202:截图模块注入游戏进程;
[0062]具体地:在截图模块的功能dll (Dynamic Link Library,动态链接库)里定义视窗全局钩子,在截图模块的程序启动时该全局钩子会对系统的所有进程进行注入,使含有截图功能的模块能在游戏的进程空间中运行。
[0063]203:Hook(钩子)游戏D3D模块的显不APKApplication Programming Interface,应用程序编程接口)。
[0064]具体地:采用Windows的Detours库(微软的一个开发库,功能:1拦截x86机器上的任意的win32API函数。2插入任意的数据段到预安装环境(PE)文件中,修改DDL文件的导入表。)Hook到D3D模块的API函数,定义自己的Detours函数来代替游戏进程的D3D模块的Target函数的功能,如果失败则截图模块退出,如果成功则进入步骤204。
[0065]204:拷贝游戏截图数据;
[0066]利用Detours函数使截图模块能正确的拷贝出游戏当前显示的图像截图的像素数据,并将像素数据按照设定的图片格式写入硬盘。
[0067]205:生成设定的图片格式并分享;
[0068]根据用户定义的图片格式生成对应的游戏截图图像,提供分享的功能使用户可以将图片分享到微博或者SNS。
[0069]本发明实施例还提供了一种截图装置,如图3所示,包括:
[0070]加载确定单元301,用于在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;
[0071]钩子注入单元302,用于若加载确定单元301确定结果为有,则向上述显示功能的模块注入全局钩子;
[0072]指令接收单元303,用于接收截图指令;
[0073]截图执行单元304,用于在指令接收单元303接收到截图指令后,通过全局钩子进行截图。
[0074]以上实现方案,在确定具有图像显示功能的模块被目标软件所加载后,向显示功能的模块注入全局钩子,通过局钩子进行截图,在实现截图的过程中可以不影响被截图软件进程,提高截图方案的应用范围,并且简单智能。并且可以仅截取被截图软件相关的图像内容避免其它例如背景元素的截入,方便快捷。
[0075]可选地,本发明实施例给出了适应于DirectX的截图具体实现方式,如图4所示,上述截图执行单元304包括:
[0076]图像处理子单元401,用于通过全局钩子获取图像显示功能模块的输出的图像,并将图像发送给应用程序编程接口,进行图像显示;
[0077]截图子单元402,用于若接收到截图指令,则截取图像处理子单元401获取到的当前的图像。
[0078]进一步地,本发明实施例为了保证截图时先执行截图逻辑然后执行目标软件相关图像的显示,达到及时准确的截图,本发明实施例给出了如下解决方案:如图5所示,上述装置还包括:
[0079]标记单元501,用于在钩子注入单元302向上述显示功能的模块注入全局钩子之后,将目标软件的的主函数中标记为有截图进程加载了上述主函数。
[0080]更具体地,本发明实施例还给出了使用库函数钩子(Hook)的具体实现方式:上述图像处理子单元401,用于通过全局钩子获取图像显示功能模块的输出的图像包括:具体用于通过全局钩子,确定目标函数,并通过目标函数的替代函数分配新内存,然后拷贝目标函数的图像数据到上述新内存;上述当前的图像为接收到截图指令时,上述新内存中的图像。
[0081]更具体地,本发明实施例还给出了使用前述截图方案并且不影响目标软件相关图像显示的具体实现方案:上述图像处理子单元401,还用于在通过目标函数的替代函数分配新内存之前,通过全局钩子,确定将要拦截的目标函数的函数地址,并复制上述函数地址的目标函数;上述用于将图像发送给应用程序编程接口,进行图像显示包括:用于在拷贝目标函数的图像数据到上述新内存之后,退出上述替代函数,恢复复制的上述目标函数并运行。
[0082]更具体地,由于运行目标软件所采用的操作系统可能存在差异,本发明实施例还给出了解决因这种差异可能导致确定目标函数的地址可能出现的错误的具体实现方式:上述图像处理子单元401,用于确定将要拦截的目标函数的函数地址包括:用于利用编程接口 DirectX提供的应用程序编程接口 API函数,创建用于图像显示的接口 API函数的接口对象;利用上述接口对象导出显示程序接口的设备对象,并依据设备对象的虚函数表的首地址,以及API函数的导出函数的位置确定目标函数的函数地址。
[0083]进一步地,本发明实施例还给出了按需截图的具体实现方式,如图6所示,上述指令接收单元303,还用于接收用户指令;
[0084]上述装置还包括:转换单元601,用于在截图完成后,按照指令接收单元303接收的上述用户指令将截图得到的图像数据转换为上述用户指令指定规格参数的图像。
[0085]进一步地,本发明实施例还给出了按需截图以后的使用实现方式举例,如图7所示,上述装置7还包括:
[0086]发送单元701,用于将转换单元601得到的用户指令指定规格参数的图像,发送至用户指令指定的地址。
[0087]值得注意的是,上述装置实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
[0088]另外,本领域普通技术人员可以理解实现上述各方法实施例中的全部或部分步骤是可以通过程序来指令相关的硬件完成,相应的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0089]以上仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明实施例揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
【权利要求】
1.一种截图方法,其特征在于,包括: 在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载;若有,则向所述显示功能的模块注入全局钩子; 在接收到截图指令后,通过全局钩子进行截图。
2.根据权利要求1所述方法,其特征在于,所述在接收到截图指令后,通过全局钩子进行截图包括: 通过全局钩子获取图像显示功能模块的输出的图像,并将图像发送给应用程序编程接口,进行图像显示; 若接收到截图指令,则截取通过全局钩子获取到的当前的图像。
3.根据权利要求2所述方法,其特征在于,在向所述显示功能的模块注入全局钩子之后还包括: 将目标软件的的主函数中标记为有截图进程加载了所述主函数。
4.根据权利要求2所述方法,其特征在于:所述通过全局钩子获取图像显示功能模块的输出的图像包括: 通过全局钩子,确定目标函数,并通过目标函数的替代函数分配新内存,然后拷贝目标函数的图像数据到所述新内存;所述当前的图像为接收到截图指令时,所述新内存中的图像。·
5.根据权利要求4所述方法,其特征在于,所述通过目标函数的替代函数分配新内存之前还包括:通过全局钩子,确定将要拦截的目标函数的函数地址,并复制所述函数地址的目标函数; 所述将图像发送给应用程序编程接口,进行图像显示包括:在拷贝目标函数的图像数据到所述新内存之后,退出所述替代函数,恢复复制的所述目标函数并运行。
6.根据权利要求5所述方法,其特征在于,所述替代函数为: 新编写的开发库函数。
7.根据权利要求5所述方法,其特征在于,所述确定将要拦截的目标函数的函数地址包括: 利用编程接口 DirectX提供的应用程序编程接口 API函数,创建用于图像显示的接口API函数的接口对象;利用所述接口对象导出显示程序接口的设备对象,并依据设备对象的虚函数表的首地址,以及API函数的导出函数的位置确定目标函数的函数地址。
8.根据权利要求1至7任意一项所述方法,其特征在于,在截图完成后还包括: 按照用户指令将截图得到的图像数据转换为所述用户指令指定规格参数的图像。
9.根据权利要求8所述方法,其特征在于,还包括: 将用户指令指定规格参数的图像,发送至用户指令指定的地址。
10.一种截图装置,其特征在于,包括: 加载确定单元,用于在目标软件启动后,确定是否有具有图像显示功能的模块被目标软件所加载; 钩子注入单元,用于若加载确定单元确定结果为有,则向所述显示功能的模块注入全局钩子; 指令接收单元,用于接收截图指令;截图执行单元,用于在指令接收单元接收到截图指令后,通过全局钩子进行截图。
11.根据权利要求10所述装置,其特征在于,所述截图执行单元包括: 图像处理子单元,用于通过全局钩子获取图像显示功能模块的输出的图像,并将图像发送给应用程序编程接口,进行图像显示; 截图子单元,用于若接收到截图指令,则截取图像处理子单元获取到的当前的图像。
12.根据权利要求11所述装置,其特征在于,还包括: 标记单元,用于在钩子注入单元向所述显示功能的模块注入全局钩子之后,将目标软件的的主函数中标记为有截图进程加载了所述主函数。
13.根据权利要求11所述装置,其特征在于: 所述图像处理子单元,用于通过全局钩子获取图像显示功能模块的输出的图像包括:具体用于通过全局钩子,确定目标函数,并通过目标函数的替代函数分配新内存,然后拷贝目标函数的图像数据到所述新内存;所述当前的图像为接收到截图指令时,所述新内存中的图像。
14.根据权利要求13所述装置,其特征在于, 所述图像处理子单元,还用于在通过目标函数的替代函数分配新内存之前,通过全局钩子,确定将要拦截的目标函数的函数地址,并复制所述函数地址的目标函数;所述用于将图像发送给应用程序编程接口,进行图像显示包括:用于在拷贝目标函数的图像数据到所述新内存之后,退出所述替代函数,恢复复制的所述目标函数并运行。
15.根据权利要求14所述装置,其特征在于, 所述图像处理子单元,用于确定 将要拦截的目标函数的函数地址包括:用于利用编程接口 DirectX提供的应用程序编程接口 API函数,创建用于图像显示的接口 API函数的接口对象;利用所述接口对象导出显示程序接口的设备对象,并依据设备对象的虚函数表的首地址,以及API函数的导出函数的位置确定目标函数的函数地址。
16.根据权利要求10至15任意一项所述装置,其特征在于, 指令接收单元,用于接收用户指令; 转换单元,用于在截图完成后,按照指令接收单元接收的所述用户指令将截图得到的图像数据转换为所述用户指令指定规格参数的图像。
17.根据权利要求16所述装置,其特征在于,还包括: 发送单元,用于将转换单元得到的用户指令指定规格参数的图像,发送至用户指令指定的地址。
【文档编号】G06F9/445GK103853576SQ201210519551
【公开日】2014年6月11日 申请日期:2012年12月6日 优先权日:2012年12月6日
【发明者】王彪 申请人:腾讯科技(深圳)有限公司