屏幕抓词的技术实现

屏幕上的文字大都是由gdi32.dll的以下几个函数显示的:TextOutA、TextOutW、ExtTextOutA、ExtTextOutW。实现屏幕抓词的关键就是截获对这些函数的调用,得到程序发给它们的参数。

我的方法有以下三个步骤:

一、得到鼠标的当前位置

通过SetWindowsHookEx实现。

二、向鼠标下的窗口发重画消息,让它调用系统函数重画

通过WindowFromPoint,ScreenToClient,InvalidateRect 实现。

三、截获对系统函数的调用,取得参数(以TextOutA为例)

1.仿照TextOutA作成自己的函数MyTextOutA,与TextOutA有相同参数和返回值,放在系统钩子所在的DLL里。

SysFunc1=(DWORD)GetProcAddress(GetModuleHandle("gdi32.dll"),"TextOutA");

BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)

{ //输出lpszString的处理

return ((FARPROC)SysFunc1)(hdc,nXStart,nYStart,lpszString,cbString);}

2.由于系统鼠标钩子已经完成注入其它GUI进程的工作,我们不需要为注入再做工作。

如果你知道所有系统钩子的函数必须要在动态库里,就不会对“注入”感到奇怪。当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称“地址空间”)。这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈(见图1)。

图1 DLL映射到虚拟地址空间中

对系统钩子来说,系统自动将包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。

3.当包含钩子的DLL注入其它进程后,寻找映射到这个进程虚拟内存里的各个模块(EXE和DLL)的基地址。EXE和DLL被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址是在链接时由链接器决定的。当你新建一个Win32工程时,VC++链接器使用缺省的基地址0x00400000。可以通过链接器的BASE选项改变模块的基地址。EXE通常被映射到虚拟内存的0x00400000处,DLL也随之有不同的基地址,通常被映射到不同进程的相同的虚拟地址空间处。

时间: 2016-01-05

屏幕抓词的技术实现的相关文章

鼠标屏幕取词技术的原理和实现

"鼠标屏幕取词"技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在windows系统中实现却是非常复杂的,总的来说有两种实现方式: 第一种:采用截获对部分gdi的api调用来实现,如textout,textouta等. 第二种:对每个设备上下文(dc)做一分copy,并跟踪所有修改上下文(dc)的操作.   第二种方法更强大,但兼容性不好,而第一种方法使用的截获windowsapi的调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用wi

利用window API实现matlab屏幕抓取函数

摘要:结合如何用window API实现matlab屏幕抓取函数,介绍了在matlab中如何利用matlab与C/C++的接口,调用操作系统API,扩展matlab功能. 引言 MATLAB 产品家族是美国 MathWorks公司开发的用于概念设计,算法开发,建模仿真,实时实现的理想的集成环境.由于其完整的专业体系和先进的设计 开发思路,使得 MATLAB 在多种领域都有广阔的应用空间. 尽管MATLAB在科学研究以及工业技术开发方面有着极为广泛的应用,但是它也不是万能的.在某些场合下,MATL

有道词典屏幕取词图片外语也能翻

  有道词典一直以来就是一款非常好用的英语学习工具,在上一次我们介绍了如何利用划词释义功能来时刻保持翻译的状态.这次我们将介绍与划词释义相似的另一个功能--屏幕取词. 屏幕取词在默认情况下通过鼠标取词,把鼠标放到哪里,就会在哪里进行取词,取词之后直接进行翻译.这种取词频率适用于对页面绝大部分的词语不熟悉,处处需要翻译的情况. 屏幕取词 开启屏幕取词同样是在有道词典主界面的右下角,与划词并排,或者通过默认热键F8来开启屏幕取词. 开启取词 当我们不需要频繁取词的时候,可以在设置界面的取词划词选项卡

Word 2010屏幕取词翻译功能简介

当你用Word在处理文档的过程中遇到了不认识的英文单词时,大概首先会想到使用电子词典,但是不巧电脑中又没有装.其实Word中就自带了不错的文档翻译功能,而在最新的Word 2010中,除了以往的文档翻译.选词翻译和英语助手之外,还加入了一个"翻译屏幕提示"的功能,可以像电子词典一样进行屏幕取词翻译. 使用Word 2010打开一篇带有英文的文档,切换到"审阅"选项卡,单击"翻译",选择下拉菜单中的"翻译屏幕提示". 开启翻译屏

无需词典 Word2010也能屏幕取词翻译

当你用Word在处理文档的过程中遇到了不认识的英文单词时,大概首先会想到使用电子词典,但是不巧电脑中又没有装.其实Word中就自带了不错的文档翻译功能,而在最新的Word 2010中,除了以往的文档翻译.选词翻译和英语助手之外,还加入了一个"翻译屏幕提示"的功能,可以像电子词典一样进行屏幕取词翻译. 使用Word 2010打开一篇带有英文的文档,切换到"审阅"选项卡,单击"翻译",选择下拉菜单中的"翻译屏幕提示". 现在只要将

有道词典怎么屏幕取词

  1.打开有道词典 2.在有道词典面板的左下角点击 "设置"==软件设置 3.弹出软件设置对话框,选择"取词划词"按钮 5.勾选"启用屏幕取词"对话框,在下面选择你要的取词方式,一般选择鼠标取词(也可以选择其它取词,每个人的习惯不一样,因人而异) 6.保存设置,返回界面,用鼠标选择你要翻译的文字选择之后,鼠标在选择的内容上停留一下,就会弹出翻译

金山词霸屏幕取词怎么用?

  在阅读英文文档时,经常遇到生词,需要查询词典,不是很便利.这里介绍使用金山词霸对PDF文档进行取词. 1.下载,安装金山词霸 2.勾选屏幕取词 3.这里找到插件设置,可以设置金山词霸对PDF取词 4.保存设置 5.打开pdf文档,鼠标在不认识的单词上停留,可以看到取词效果

有道词典屏幕取词方法

  有道词典屏幕取词方法.说到翻译软件,相信不少人都在使用有道词典大.而有道词典现在又多了很多新功能,相信带可能还不是很清楚.今天,小编来跟大家推荐屏幕取词,在大家在用有道词典的时候要用这一功能应该如何操作呢?下面小编为大家分享翻译软件有道词典屏幕取词方法. 1.打开有道词典 翻译软件有道词典 2.在有道词典面板的左下角点击 "设置"==软件设置 翻译软件有道词典 3.弹出软件设置对话框,选择"取词划词"按钮 5.勾选"启用屏幕取词"对话框,在下

有道词典如何鼠标取词或屏幕取词?

  有道词典怎么鼠标取词或屏幕取词?有道词典是一款非常好用的翻译应用软件,在阅读外文文章或网站时,如果每次遇到不认识的单词都查阅一下,会导致效率很低.其实,有道词典电脑版可以进行屏幕取词,只要把光标移动到陌生单词上,就能屏幕取词,达到自动翻译的效果.不仅能对文本取词,图片上的文字亦可.下面,安下小编就给大家带来有道词典屏幕取词的方法的详细介绍. 有道词典屏幕取词的方法 打开有道词典,在软件窗口的右下角勾选"取词"和"划词". 这时候再去看文档,只要把鼠标指针移动到一