社区
Delphi
帖子详情
高手请进来
tohail
2003-09-21 11:08:13
如何实现屏幕取词的功能,比如金山词霸用鼠标在屏幕上的某一个汉字或者英文单词鼠标单击,汉字和单词自动出现在编辑框中,比如tedit等控件中,分不够在加,不懂的不要UP谢谢合作
...全文
67
14
打赏
收藏
高手请进来
如何实现屏幕取词的功能,比如金山词霸用鼠标在屏幕上的某一个汉字或者英文单词鼠标单击,汉字和单词自动出现在编辑框中,比如tedit等控件中,分不够在加,不懂的不要UP谢谢合作
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
PrgmLover
2003-09-23
打赏
举报
回复
要实现取词,主要要解决以下技术问题。
1.截取API入口,获得API的参数。
2.安全地潜入Windows内部,良好地兼容Windows的各个版本
3.计算鼠标所在的单词和字母。
4.如果你在Window95下,做32位程序,还涉及Windows32/16混合编程的技术。
取词的过程:
0 判断鼠标是否在一个地方停留了一段时间
1 取得鼠标当前位置
2 以鼠标位置为中心生成一个矩形
3 挂上API钩子
4 让这个矩形产生重画消息
5 在钩子里等输出字符
6 计算鼠标在哪个单词上面,把这个单词保存下来
7 如果得到单词则摘掉API钩子,在一段时间后,无论是否得到单词都摘掉API钩子
8 用单词查词库,显示解释框。
很多步骤实现起来都有一些难度,所以在中国可以做一个完善的取词词典的人屈指可数
说如何挂钩子:
所谓钩子其实就是在WindowsAPI入口写一个JMP XXXX:XXXX语句,跳转到自己的代码里。
步骤如下:
1.取得Windows API入口,用GetProcAddress实现
2.保存API入口的前五个字节,因为JMP是0xEA,地址是4个字节
3.写入跳转语句
这步最复杂
Windows的代码段本来是不可以写的,但是Microsoft给自己留了个后门。
有一个未公开函数是AllocCsToDsAlias,
UINT WINAPI ALLOCCSTODSALIAS(UINT);
你可以取到这个函数的入口,把API的代码段的选择符(要是不知道什么是选择符,就先
去学学保护模式编程吧)传给他,他会返回一个可写的数据段选择符。这个选择符用完
要释放的。用新选择符和API入口的偏移量合成一个指针就可以写windows的代码段了。
这就是取词技术的最核心的东东,不止取词,连外挂中文平台全屏汉化都是使用的这种
技术。现在知道为什么这么简单的几句话却很少知道了吧?因为太多的产品使用他,太
多的公司靠他赚钱了。
这些公司和产品有:中文之星,四通利方,南极星,金山词霸,实达铭泰的东方快车,
roboword,译典通,即时汉化专家等等等等。。。。还有至少20多家小公司。他们的具体
实现虽然不同,但大致原理是相同的。
PrgmLover
2003-09-23
打赏
举报
回复
转载:
“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山
词霸等软件,这个技术看似简单,其实在windows系统中实现却是非常复杂的,总
的来说有两种实现方式:
第一种:采用截获对部分gdi的api调用来实现,如textout,textouta等。
第二种:对每个设备上下文(dc)做一分copy,并跟踪所有修改上下文(dc)的
操作。
第二种方法更强大,但兼容性不好,而第一种方法使用的截获windowsapi的
调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用windowsapi
拦截技术,你可以改造整个操作系统,事实上很多外挂式windows中文平台就是
这么实现的!而这项技术也正是这篇文章的主题。
截windowsapi的调用,具体的说来也可以分为两种方法:
第一种方法通过直接改写winapi 在内存中的映像,嵌入汇编代码,使之被
调用时跳转到指定的地址运行来截获;第二种方法则改写iat(import address table
输入地址表),重定向winapi函数的调用来实现对winapi的截获。
第一种方法的实现较为繁琐,而且在win95、98下面更有难度,这是因为虽
然微软说win16的api只是为了兼容性才保留下来,程序员应该尽可能地调用32位
的api,实际上根本就不是这样!Win 9x内部的大部分32位api经过变换调用了同
名的16位api,也就是说我们需要在拦截的函数中嵌入16位汇编代码!
PrgmLover
2003-09-23
打赏
举报
回复
快结贴哦
tohail
2003-09-22
打赏
举报
回复
那位高手能不能给我一段示范代码阿 我急用谢谢,有马上给分结帖
tohail
2003-09-22
打赏
举报
回复
到 真得没有人回答我问题啊
nyf1220
2003-09-21
打赏
举报
回复
用hook技术,不过,不会,超级猛可里有个介绍的
tohail
2003-09-21
打赏
举报
回复
bluenightsky 能不能给我一个一个示范代码啊
bluenightsky
2003-09-21
打赏
举报
回复
这其实就是API钩子
bluenightsky
2003-09-21
打赏
举报
回复
方法:
直接替换系统函数前5个字节,用jmp+我自己的函数地址替换,这样一旦系统函数调用就会跳到我自己的函数,首先恢复系统函数前5个字节,运行完我自己的函数,照样运行系统函数,然后再用jmp+我自己的函数地址替换系统函数前5字节
hiflower
2003-09-21
打赏
举报
回复
可以取得鼠标位置的窗口句柄,然后取得该窗口的内容
没做过 :)
tohail
2003-09-21
打赏
举报
回复
nyf1220(浅水游虫) 哪儿有下载的能告诉我嘛?谢谢
nyf1220
2003-09-21
打赏
举报
回复
说过了,超级猛料里有例子,自己看!
tohail
2003-09-21
打赏
举报
回复
我到真的没有人懂啊
tohail
2003-09-21
打赏
举报
回复
到没有高手来给俺看看啊:(((((( 伤心中
初中经典几何题,95%的同学都不会做,
高手
请进来
2016-03-21 16:25 几何是初中数学最主要的内容,对大多数孩子来说也是比较难的内容。而我们想要战胜这一比较难的题型,我们就需要多多练题
初中经典几何题,95%的同学都不会做,
高手
请进来
2016-03-21 16:25 几何是初中数学最主要的内容,对大多数孩子来说也是比较难的内容。而我们想要战胜这一比较难的题型,我们就需要多多练题。 经典难题(一) 1、...
高手
请进来
过招
谁能帮助我讲一下SISD计算机 SIMD计算机 MISD计算机 MIMD 计算机是什么啊???本人虚心求教
这是一个DirectInput使用出现了一个小问题 directx
高手
请进来
指点江山
这是一个DirectInput使用出现了一个小问题具体问题如下:设置DInput的协作标志时 如result=pDKB->SetCooperativeLevel(hwnd,DISCL_NONEXCLUSIVE|DISCL_FOREGROUND);这里的协作标志设置 只有DISCL_NONEXCLUSIVE|DISCL...
#中字符串模糊比较问题,请
高手
进来看看
C#中字符串模糊比较问题,请
高手
进来看看 大神爱编程 发表于: 2009-11-23 08:40 来源: 图书馆我想对两个字符串进行比较,例如: <br />CODE: string num1="13406989855"; string num...
Java客流分析_java编程一地铁客流仿真模拟软件。
高手
大神进来帮帮忙啊~
高手
大神进来帮帮忙啊~功能包括交通线路各车站多种典型日客流函数的自动生成、修正、取值、图形显示等。模拟输入早上6点到晚上11点各个时间段的进站人数,出站人数。站点不用过多 5个就行其中包括6个客流函数,上行...
Delphi
5,927
社区成员
262,932
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章