![](https://csdnimg.cn/release/download_crawler_static/86334114/bg1.jpg)
第 26卷 湖北师范学院学报
(
自然科学版
)
Vol126
第 2期 Journal of Hubei Normal University
(
Natural Science
)
No12, 2006
W indows操作系统中屏幕取词技术的研究
童 强
(
湖北师范学院 计算机科学系 ,湖北 黄石 435002
)
摘要 :分析 W indows操作系统中屏幕取词技术的原理和实现方法 ,并对其中涉及到的钩子函数的使用 ,AP I
拦截以及进程间通讯等关键技术和步骤进行了深入研究。
关键词 :钩子 ;动态连接库 ; AP I拦截 ;屏幕取词
中图分类号 : TP316. 7; TP311. 52 文献标识码 : A 文章编号 : 100922714
(
2006
)
0220075204
0 引言
虽然屏幕取词技术被很多翻译软件及字典软件应用 ,但是由于其核心涉及到 W indows操作系统
的很多底层技术 ,包括 hook技术 ,API拦截技术、动态库管理以及进程间的通讯等 ,实现起来却比较
复杂。实现屏幕取词所涉及的这些底层技术也可以运用到其它软件开发中 ,还有助于剖析和理解
W indows操作系统。
1 实现屏幕取词的原理
要实现屏幕取词首先要了解在 W indows操作系统的文本是如何输出的 ,实际上 W indows系统下
屏幕上不管具体是哪个应用程序的文本输出 ,最后都是调用 W indows系统的动态库 GD I32. dll中的
TextOutA、TextOutW、ExtTextOutA、ExtTextOutW 等几个 API函数实现的。即不论哪个程序 ,只要输出
文本都会在程序模块中导入动态库 GD I32. dll,并最终利用上述几个函数输出文本。其中 TextOutA
和 ExtTextOutA用于输出 ANSI字符 , TextOutW 和 ExtTextOutW 用于输出 unicode字符。所以实现鼠
标屏幕取词的关键就是如何设法在 W indows字符输出的时候取得这几个 API函数的参数。可以通过
采用 APIHOOK技术实现对这几个 API函数的挂接 ,在输出字符的时候截获 API函数的参数 ,这些参
数包括输出的文本的字符串以及及其输出的位置坐标信息。
根据 W indows系统的工作原理 ,当窗体全部或部分需要刷新时 , TextOutA等 API就会被调用重新
输出
[ 1 ]
,比如一个窗体盖住了另一个窗体 ,当上面窗体移开后下面的窗体会收到系统的 WM _PA INT
消息而刷新 , TextOutA等被调用绘制文字部分 ,看起来就像真是露出了原来被挡住的部分。因此必须
设法在需要的时候让有关窗体的有关区域刷新 ,具体做法就是在鼠标所在位置画一个小窗体挡住下
面的窗体一下
(
肉眼看不出来
)
,下面的窗体被挡住的字符就会重绘 ,
(
另外一种方法是调用 Invalidae2
rect和 Updada window函数强制区域刷新
)
那几个已经被挂接的 API就会被调用了 ,于是在挂接的钩
子函数中可以获得其参数 ,通过计算鼠标位置和输出文本位置就得到了鼠标下的文字了。
主要步骤如下 :
1
)
挂上 API钩子 ;
收稿日期 : 2005—10—12
作者简介 :童 强
(
1968—
)
,男 ,湖北黄石人 ,讲师 ,工程师 ,硕士 ,主要研究方向为多媒体应用技术、Web应用技术等。
·57·