Hook Win32 API 的应用研究之四:屏幕取词(END)

 
                用过金山词霸吧?用过的人一定对它的屏幕取词功能印象很深刻,因为这种功能使翻译过程更加简便快捷,屏幕取词是金山词霸的核心技术之一。
 
               
            大家有没有想过这样神奇的功能是如何实现的呢?经历过DOS年代系统编程的人可能知道,屏幕上显示的字符是存放在显存里的,每个坐标的字符对应显存的一个特定的现存单元存储的字符,直接操作显存,就可以进行字符的显示和读取,若WINDOWS是这样就好了,可惜事实上相去甚远。那WINDOWS的字符是怎样显示的呢?WINDOWS是图形界面,显示的最小单位是像素(Pixel),上面的所有东西都是 上去的,当然也包括了字符,也就没有什么字符显存的概念了。没有了直接操作显存而获得屏幕上字符内容的办法了,那还有什么方法呢?
 
               
            让我们来设身处地地想想看,假如我们要在自己的程序中显示一个字符串,我们会怎样做呢?不要回答是MessageBox(),我们不是指的这种 显示 方法,我指的是最低阶的方法,也就是直接操作DC的方法,我想一般就是调用上面提到过的Win32
            API函数TextOut()了,当然,还有类似的一些其它函数,例如:ExtTextOut()、DrawText()、DrawTextEx()等等。好了,找到点眉目了,我们来看看这些函数的参数能提供哪些信息,这里只列出TextOut()函数的定义,其它的函数基本都包含这些参数,另外提供了更多的附加选项而已,请查阅MSDN相关文档:
 
            BOOL TextOut(
              HDC       hdc, // 设备上下文句柄
              int       nXStart, // 开始绘制字符串的位置的x坐标
              int       nYStart, // 开始绘制字符串的位置的y坐标
              LPCTSTR   lpString, // 指向字符串的指针
              int       cbString // 指明要绘制多少个字符
            );
 
               
            我们看到,坐标和内容都有了,这不正是我们想要的信息吗?只要Hook住这个函数,这些信息不都唾手可得了吗?于是祭出Hook大法来做个实验:先随便用VC的向导开辟一个单文档应用程序,在OnDraw()函数里调用TextOut()在某个位置随便输出一个字符串(不论是调用pDC->TextOut(...)或者是::TextOut(...)都一样,CDC类只不过把TextOut()封装了一下而已),然后在OnInitialUpdate()里设置Hook(用现成的库),钩住TextOut(),截获TextOut之后,让TextOut()输出另外一个字符串而不输出原来的字符串。还要记住在OnDestroy()里解除Hook。最后编译连接,测试程序。你会发现不仅是你调用TextOut()输出的地方的字符串被替换了,而且连才旦、对话框等等有字的地方也变了,在实验成功之余,是不是个意外的收获?其实WINDOWS内部的大多数文字输出也是调用了TextOut()函数来实现的。现在水落石出了,我们只要Hook住文字输出函数,包括我上面提到的和没有提到的函数,就能截获屏幕上文字输出的坐标和内容等等信息,只要我们一一作记录,并加以分析转换,跟鼠标的位置进行比较,我们就能得到屏幕上某个位置的文字内容是什么了,要翻译怎么的,就看你的了,这就是屏幕取词,虽然实际上实现的过程并不像说得那么简单。
 
                出了词霸的屏幕取词,还有一些动态汉化、外挂中文平台之类的软件,也是基于这种技术的,现在看来,它们是不是已经不再神秘了?
 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值