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

合集下载

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

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

鼠标屏幕取词技术的原理和实现鼠标屏幕取词技术的原理和实现“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在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位汇编代码~我们将要介绍的是第二种拦截方法,这种方法在win95、98和nt下面运行都比较稳定,兼容性较好。

由于需要用到关于windows虚拟内存的管理、打破进程边界墙、向应用程序的进程空间中注入代码、pe(portable executable)文件格式和iat(输入地址表)等较底层的知识,所以我们先对涉及到的这些知识大概地做一个介绍,最后会给出拦截部分的关键代码。

windows拖拉鼠标选中文本的实现过程

windows拖拉鼠标选中文本的实现过程

windows拖拉鼠标选中文本的实现过程
摘要:
一、Windows 操作系统的文本选取方式
二、拖拉鼠标选中文本的实现原理
1.鼠标点击选取
2.拖动鼠标选中文本
3.释放鼠标按钮确认选取
三、Windows 操作系统的文本编辑功能
正文:
在Windows 操作系统中,用户可以通过多种方式选取文本。

其中,拖拉鼠标选中文本是最常用的一种方式。

下面,我们来详细了解一下这个过程的实现原理。

首先,用户需要用鼠标点击要选取的文本的开始位置。

这个时候,操作系统会记录下鼠标点击的位置和时间,同时将光标定位到这个位置。

这个过程依赖于操作系统的鼠标驱动程序和窗口管理系统。

接下来,用户按住鼠标按钮并拖动鼠标,以选取需要的文本。

在这个过程中,操作系统会不断地更新鼠标的位置信息,并根据鼠标的位置和光标的位置计算出选取的文本范围。

这个计算过程涉及到操作系统的文本编辑功能,包括对文本的定位、选择和显示等。

最后,当用户释放鼠标按钮时,操作系统会根据鼠标释放的位置和时间来确认选取的文本范围。

如果选取的文本范围符合用户的需求,那么这个选取过
程就完成了。

如果用户需要调整选取范围,那么可以再次进行拖动鼠标的操作。

总的来说,Windows 操作系统通过拖拉鼠标选中文本的方式,为用户提供了方便快捷的文本选取功能。

Delphi屏幕取词

Delphi屏幕取词

Delphi屏幕取词屏幕取词(Delphi)(1)“ 屏幕取词”的实现//-----------------------------------------------------------------1用SetWindowsHookEx()安装鼠标钩子MouseProc;2在屏幕上移动鼠标时,系统就会调用鼠标钩子MouseProc;3进入MouseProc,获得鼠标的坐标(x,y),设置对T extOut()、ExtTextOut()等的跟踪程序,用invalidateRect()告诉系统该点(x,y)“失效”;4系统发出WM_PAINT消息,指示该点(x,y)处的应用程序重绘“失效”的区域。

5负责绘制该点()的应用程序在受到 WM_PAINT 消息后,就有机会调用TextOut()、 ExtTextOut()等函数。

6调用的函数被拦截进入跟踪程序:设置好了的跟踪程序截获了该次调用,从应用程序的堆栈中取出该点(x,y)“文字”的指针;7从应用程序的数据段中将“文字”指针的内容取出,即完成了一次“屏幕抓字”;8退出跟踪程序,返回到鼠标钩子MouseProc;9在MouseProc中解除对TextOut() ExtTextOut()的跟踪;10退出MouseProc鼠标钩子程序,控制权交给系统。

11在屏幕上移动鼠标,开始下一次“屏幕抓字”,返回步骤2。

//-----------------------------------------------------------------Dll工程.GetWordDll.dpr//-----------------------------------------------------------------------------------library GetWordDll;usesWindows,SysUtils,Classes,UnitHookDll in 'UnitHookDll.pas',UnitNt2000Hook in 'UnitNt2000Hook.pas',UnitHookType in 'UnitHookType.pas';exportsStartHook,StopHook,// MouseWndProc,{以下导出列表都是必须的,不能少,因为程序要取其地址}NewBeginPaint,NewCreateCompatibleDC,NewTextOutA,NewTextOutW,NewExtTextOutA,NewExtTextOutW,NewDrawTextA,NewDrawTextW;beginend.UnitHookType.pasunit UnitHookType;interfaceuses windows, messages;constMaxStringLen = 100;WM_MOUSEPT = WM_USER + 1138; MappingFileName = 'GetWord32 for 9x NT 2000'; fBeginPaint=0;fGetWindowDC=1;fGetDC=2;fCreateCompatibleDC=3;fTextOutA=4;fTextOutW=5;fExtTextOutA=6;fExtTextOutW=7;fDrawTextA=8;fDrawTextW=9;typePPointer = ^Pointer;TShareMem = packed recordhProcWnd: HWND; {主应用窗口句柄}hHookWnd: HWND; {鼠标所在窗口}pMouse: TPoint; {鼠标信息}DCMouse,DCCompatible: HDC;fTimerID: integer;fStrMouseQueue: array[0..MaxStringLen] of Char; {鼠标信息串} nTimePassed: integer; {鼠标停留的时间}bCanSpyNow: Boolean; {开始取词}Text: array[0..MaxStringLen] of Char; {字符串}end;PShareMem = ^TShareMem;implementationend.UnitNt2000Hook.pas//-----------------------------------------------------------------------------------unit UnitNt2000Hook;interfaceuses classes, Windows,SysUtils, messages,dialogs;typeTImportCode = packed recordJumpInstruction: Word;AddressOfPointerT oFunction: PPointer;end;PImportCode = ^TImportCode;PImage_Import_Entry = ^Image_Import_Entry;Image_Import_Entry = recordCharacteristics: DWORD;TimeDateStamp: DWORD;MajorVersion: Word;MinorVersion: Word;Name: DWORD;LookupTable: DWORD;end;TLongJmp = packed recordJmpCode: ShortInt; {指令,用$E9来代替系统的指令}FuncAddr: DWORD; {函数地址}end;THookClass = classprivateTrap:boolean; {调用方式:True陷阱式,False改引入表式}hProcess: Cardinal; {进程句柄,只用于陷阱式}AlreadyHook:boolean; {是否已安装Hook,只用于陷阱式}AllowChange:boolean; {是否允许安装、卸载Hook,只用于改引入表式}Oldcode: array[0..4]of byte; {系统函数原来的前5个字节}Newcode: TLongJmp; {将要写在系统函数的前5个字节}privatepublicOldFunction,NewFunction:Pointer;{被截函数、自定义函数}constructor Create(IsTrap:boolean;OldFun,NewFun:pointer);constructor Destroy;procedure Restore;procedure Change;publishedend;implementation{取函数的实际地址。

API HOOK 金山词霸取词功能原理

API HOOK 金山词霸取词功能原理
不固定,所以需要从指令流里面动态析出它的地址。
3.4 动态生成JMP指令
动态生成的JMP指令占用5个字节,保存在一个数组里面。以生成跳转到TextOut的替
代函数myTextOut的JMP指令为例:
BYTE ins[5]; //保存JMP指令
符串:
. 代码拦截:Windows以DLL方式提供系统服务,可以方便地获取Windows字符输出API的地址,修改其入口代码,拦截应用程序对它们的调用。
. 鼠标HOOK:安装WH-MOUSEPROC类型的全局鼠标HOOK过程,监视鼠标在整个屏幕上的移动。
数入口的代码,再调用TextOut()执行正常的字符输出,接下来SpyCode()在被拦截函数
入口再次放入JMP指令,最后返回调用进程。
3.3 获取被拦截API的动态链接地址
TextOut和ExtTextOut的地址可以通过GetProcAddress取得,而TextOut16W和ExtTextOut16W既未公 开于文档,也没有用字符串或序号从gdi.exe中引出,无法使用GetProcAddress取得它们的地址。下面讨论如何解决这个问题。
. 获取GDI代码段的基地址和界限;
. 用当前DS复制一个新的段选择子,该选择子的描述符具有可读写的属性;
. 将复制得到的选择子的基地址和界限设置为GDI代码段的基地址和界限;
. 将复制得到的选择子的基地址和界限设置为GDI代码段的基地址和界限;
不同的索引来从该表格里面取目的地址。ExtTextOutW和TextOutW分别使用索引B2H和30
H,取表中相应元素作为ExtTextOut16W和TextOut16W的地址。取得这个数组的起始位置

藏文鼠标屏幕取词的原理与实现

藏文鼠标屏幕取词的原理与实现
信息技术
《 西藏科技)08 1 期( ) 0 年 1 总第 18 2 8 期)
藏 文 鼠 标 屏 幕 取 词 的 原 理 与 实 现
小尼 玛扎 西 珠 杰 杨 帆 ( 西藏 大学工学院 , 西藏 拉 萨 80 0 ) 50 0
摘 要 : 文讨 论 了藏 文 鼠标屏 幕取 词技 术 的原理 , 点 阐述 了所 涉及 到 的若 干 关键 技 术 , 出 了利 用 本 重 给
78
钩 子 的本 质 是 Wi3 n2操 作 系统 中 一 段 用 以处 理
系统消息或特定事件的函数 , 通过系统调用将其挂人 到系统。钩子根据其对消息监视范 围的不同而分为系
《 西藏科技 ̄08 1 期【 20 年 1 总第 18 8 期)
统全 局钩 子 和 线 程 局 部 钩子 ( oa H o ) 大 类 , Lcl ok 两 其 中线 程局 部钩 子 只能监 视 本 进 程 中某 个 指定 的线 程 , 而全 局钩 子则 可对 在 当前 系统下 运行 的所 有线程 进 行 监视 。由于 “ 文 鼠标 屏 幕 取 词 ” 藏 中用 到 的是 系统 鼠

, 冒 r

的若 干关 键 技术 进 行讨 论 。使 用全 局 钩子 ( l a Go l b
Ho ) ok 打破 进程 边界 , 修改 P 并 E文 件 的输 入 地址 表 来 实 现对 系统 A I P 函数 的截 获 , 而实 现 藏 文 鼠标屏 幕 从
取词。
蓬_ _ -
图 2 1 截 获 目标涵数前 .
l 2

目 标 函 数
2 鼠 标 屏 幕 取 词 实 现 原 理
进 程 A( 词 的 主 应 用 程 序 ) 了取 得 屏 幕 上某 取 为

鼠标取词

鼠标取词

鼠标取词原理初探其实这是个老话题了,自从这项技术面世以来就已经被讨论了无数遍。

事实上,这个看起来很牛逼的东西其实不是想象中的那么难,方法也有多种多样,而且,有了先前各位大牛的研究成果,实现这项技术变得相对容易很多。

最主要的是,编写的过程中能让人学到很多知识。

好了,话不多说,直接进入主题。

在Windows平台下,输出文字基本上都是靠TextOut,ExtTextOut这两个API实现。

也有DrawText这样的函数,但最终也是调用了ExtTextOut(TextOut其实就是ExtTextOut的特殊版本)。

在Windows 9x下是如此,Windows NT下也是,不过就是有了ANSI和Unicode两个版本的区别。

若能截获这些API,转到自己的函数里,便能得到输出的字符串,实现取词功能。

______________________________________________________________BOOL WINAPI MyExtTextOutA( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCSTR lpString, UINT c, CONST INT * lpDx){// lpString便是所要的字符串(ANSI),在此进行处理// 然后调用正版的API输出字符return ::ExtTextOutA(hdc,x,y,options,lprect,lpString,c,lpDx);}看到这里,聪明的你肯定已经想到了,这不就是要实现一个API钩子么。

确实是这样,鼠标取词的核心技术就是API钩子。

事实上,有了API钩子,你可以干很多事情(比如拦截WinSock的sendto / recvfrom函数来实现数据包的截取等)。

实现API钩子主要有两种方法,一种是修改exe文件在内存中各个模块的导入函数表,另一种则是经典的内嵌汇编代码,采用JMP XXXX跳转到你自己的函数。

科大讯飞智能语音鼠标功能使用

科大讯飞智能语音鼠标功能使用

科大讯飞智能语音鼠标MiMouse S功能使用对于需要使用电脑的人群来说,都离不开电脑外设——鼠标。

在人们固有思维模式下,鼠标是一个简单的外设。

随着计算机的功能外形功能不断优化,鼠标也需要与时俱进。

本文介绍的是一款科大讯飞智能语音鼠标。

外形区别于传统笨重的鼠标造型的产品,并且依托科大讯飞语音识别技术与AIUI技术的支持实现语音上网、语音打字、语音翻译、语音控制、音频转文字等操作。

第一部分:产品包装1、产品采用了白色礼盒式的包装设计,拆封非常简单。

2、包装盒背面是产品的编码和简单属性说明3、拆开包装盒,在一层塑封膜下面的MiMouse S鼠标4、在卡纸下方有个盒子,盒子里面装有说明书,以及充电数据线。

第二部分:产品外观1、外观相对来说是超薄迷你便携无线式2、正面除了常规的按键之外还增添了左侧语音键以及右侧特殊功能键,中间凹陷弧线提供握持支点3、左侧语音键可以进行语音打字,语音上网等。

按下左侧语音键说话,说完松手就可实现。

4、右侧特殊功能键用于屏幕取词翻译以及在office中进行相应的智能控制。

5、背面左侧充电口,右侧是带有拨动设计的电源开关,底部还增加了可拆后盖6、背面可拆后盖收纳仓内放置了一枚无线适配器7、尾部与前端存在落差使得尾部造型更为饱满8、侧边设计,带有高光效果第三部分:产品使用1、调试无线适配器(1)打开MiMouse S背面滑盖,逆时针旋转10°,打开后盖了(打开会听见一声响。

第一次打开后盖的时候回有点紧,这时需要您轻轻在手掌上拍几下);(2)取出放在MiMouse S后盖中的无线适配器;(3)在电脑上USB接口插入无线接收器,就会开始安装鼠标硬件驱动(第一次可能需要等待1-2分钟,当鼠标可以正常移动的时候,则表示驱动已经成功安装了);(4)顺时针转动可拆后盖,扣紧后盖。

注:当配对不上,需同时按住左侧语音键以及右侧按键(不是右侧特殊功能键)10s-30s,就可以配对成功了2、下载产品软件驱动程序(1)登录咪鼠官网下载相应产品的驱动软件(咪鼠官网:);(2)在导航栏中找到软件下载,找到对应的MiMouse S的驱动软件,点击立即下载;(3)安装驱动软件3、成功安装驱动安装完成后,会在电脑屏幕右下角出现一个图标。

Windows操作系统中屏幕取词技术的研究

Windows操作系统中屏幕取词技术的研究
主要步 骤如 下 :
1 挂 EA I 子 ; ) P 钩
收 稿 日期 :05 1一 1 2 0— O 2
作者简介 : 童
强( 98 16一
)男 , , 湖北黄石人 , 讲师 , 工程师 , 硕士 , 主要研究方 向为多媒 体应 用技术 、 b应用技术等 。 We

7 ・ 5
维普资讯
2 得到鼠标当前位置 , ) 并设法让鼠标下的窗口刷新 ; 3 在 A I 子 函数 中截 获字 符 串 , 根 据 鼠标 位 置 计 算 出 鼠标 下 的 字 符 ; 调 用 原 型 函数 完 成 ) P钩 并 并 刷 新工作 。 为 了随 时知道 鼠标 的位 置 , 要 安装一 个 鼠标 钩子 以便 随时 得 到 鼠标 的屏 幕 坐 标 。这 里用 到 了 还 两 种钩 子 , 鼠标 钩 子和 前 面提 到 的 A I 子 。 即 P钩
维普资讯
第2 6卷
第 2期
湖北师范学 院学报 ( 自然科学版 )
Jun f u e N r l nvrti c ) l ma U sy ul e
Vo. 6 12 No 2, 0 6 . 20
Widw 操 作 系 统 中 屏 幕 取 词 技 术 的 研 究 no s
童 强
( 湖北 师 范 学院 计 算机科 学 系, 湖北 黄石 4 50 ) 30 2
摘要 : 分析 Wid w 操作 系统 中屏幕取词技术的原理和 实现方法 , nos 并对其 中涉及到 的钩 子 函数的使 用, P AI
2 挂 接 A I 子 截 获 A I 数 P钩 P参
如前所述 , 要获得系统 A I P 的输出参数 , 关键就是对几个有关文本输出的 A I P 函数进行挂接。实

鼠标取词

鼠标取词

鼠标取词在有些软件里当鼠标移到某单词上,其注释就会显示单词的中文解释.这样的软件是如何制作的呢?下面我就介绍以下获取鼠标所在单词的方法,至于中文结实要关系到数据库及字库问题在此我不做解释.首先建立新工程,在FORM上添加一个TEXT文本框.声明SendMessage函数.Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst EM_CHARFORMPOS=&HD7 '在API浏览器里无此值请自己加上.自定义过程:Private Sub Text1_MouseDown(Button As Intege,Shift As Integer,x As Single , y As Single)'获取鼠标所点的是第几行第几个字符Dim pos As Long,Lc As LongDim Line As Integer,CharPos As Integerx=x/Screen.TwipsPerPixelXy=y/Screen.TwipsperPixelYpos=x+y*65536Lc=SendMessage(Text1.hwnd,EM_CHARFROMPOS,0,ByVal pos)Line=Lc\65536 '第几行CharPos=Lc MOD 65536 '第几个字符End Sub'接下来才是真正的读取函数Function GetWord(txt As TextBox,pos As Integer) As String Dim bArr()As Byte,pos1 As Integer,pos2 As Integer, i As IntegerbArr=StrConv(txt.Text,vbFromUnicode) '转换成Byte数组pos1=0:pos2=UBound(bArr)'向前搜索分格符的位置For i=pos-1 To 0 Step -1If IsDelimiter(bArr(i)) Thenpos1=i+1Exit ForEnd IfNext'向后搜寻分隔符字符的位置For i=pos To UBound(bArr)If IsDelimiter(bArr(i)) Thenpos2=i-1Exit ForEnd IfNext'截取pos1-pos2之间的字符,以构成一个单词If pos2> pos1 ThenReDim bArr2(pos2-pos1) As ByteFor i=pos1 To Pos2bArr2(i-pos1)=bArr(i)NextGetWord=StrConv(bArr2,vbUnicode)ElseGetWord= " "End IfEnd Function'IsDelimiter函数Functon IsDelimiter(ByVal Char As Byte) As BooleanDim S As StringS=Chr(Char)IsDelimiter=FalseIf S= " " Or S= ", " Or S= ". " Or S= "? " Or S= "vbCr Or S=vbLf ThenIsDelimiter=TrueEnd IfEnd Function。

鼠标取词翻译

鼠标取词翻译

鼠标取词翻译【原创实用版】目录1.鼠标取词翻译的定义和作用2.鼠标取词翻译的操作方法3.鼠标取词翻译的优缺点4.鼠标取词翻译的应用场景5.未来发展趋势和展望正文在当今全球化时代,语言交流成为了人们日常工作、学习和生活中不可或缺的一部分。

为了更好地促进不同语言之间的沟通,翻译工具应运而生。

其中,鼠标取词翻译作为一种实用便捷的翻译方式,逐渐受到用户的青睐。

本文将对鼠标取词翻译的定义、操作方法、优缺点、应用场景以及未来发展趋势进行详细介绍。

一、鼠标取词翻译的定义和作用鼠标取词翻译是指用户在阅读一篇文章或文档时,只需用鼠标点击所要翻译的词汇,翻译工具即可快速将该词汇翻译成其他语言。

这种翻译方式有效地解决了用户在阅读过程中遇到的生词、难词等问题,提高了阅读效率。

二、鼠标取词翻译的操作方法鼠标取词翻译的操作方法非常简单。

首先,用户需要在电脑上安装一款鼠标取词翻译插件或者浏览器扩展。

安装完成后,用户在阅读文档时,只需将鼠标悬停在需要翻译的词汇上,插件或扩展就会自动识别并翻译该词汇。

部分翻译插件还可以实现整句翻译、语音翻译等功能,满足用户多样化的需求。

三、鼠标取词翻译的优缺点鼠标取词翻译具有操作简便、实时翻译、准确性高等优点。

然而,它也存在一些不足之处。

首先,由于不同翻译工具的词库和算法不同,翻译结果可能存在差异。

其次,鼠标取词翻译无法翻译句子结构和语境,对于一些复杂的语句,翻译效果可能不尽如人意。

四、鼠标取词翻译的应用场景鼠标取词翻译广泛应用于学术研究、商务交流、跨语言教育等领域。

特别是在涉及多语言的学术论文阅读、国际贸易合同签订等场景中,鼠标取词翻译能够为用户提供极大的便利。

五、未来发展趋势和展望随着人工智能技术的不断发展,未来鼠标取词翻译将更加智能化、精确化。

例如,结合语义分析、情感分析等功能,提供更符合语境的翻译结果。

同时,随着跨语言交流的需求不断增长,鼠标取词翻译的市场前景也将更加广阔。

总之,鼠标取词翻译作为一种实用便捷的翻译工具,已经深入到我们日常生活的方方面面。

操作系统中鼠标操作原理

操作系统中鼠标操作原理

操作系统HID接口
而在创建具体的设备节点之前,Event Handler层需要先注册一类设备的输入事件处理函数及相关 接口 static int __init mousedev_init(void) { //注册输入事件处理、连接、断开、设备(文件)操作函数 input_register_handler(&mousedev_handler); //创建输入设备节点 devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX), S_IFCHR|S_IRUGO|S_IWUSR, "input/mice"); } static struct input_handler mousedev_handler = { .event = mousedev_event,//REL(相对坐标)、按键、ABS(绝对坐标)、SYNC等事件处 理 .connect = mousedev_connect, .disconnect = mousedev_disconnect, .fops = &mousedev_fops,//鼠标打开、poll、读写等操作 .minor = MOUSEDEV_MINOR_BASE, .name = "mousedeቤተ መጻሕፍቲ ባይዱ", .id_table = mousedev_ids, };
HID协议简介
下面仅对这3个HID设备类特定描述符中的HID描 述符进行说明。 HID描述符关联于接口描述符,因而如果一个设 备只有一个接口描述符,则无论它有几个端点描 述符,HID设备只有一个HID描述符。HID设备描 述符主要描述HID规范的版本号、HID通信所使 用的额外描述B HID类可采用的通信管道 所有的HID设备通过USB的控制管道(默认管道 ,即端点0)和中断管道与主机通信。 USB HID规范定义的HID设备可用端点包含三种 管道: 1、控制(端点0)( 必选) 传输USB描述符、类请求 代码以及供查询的消息数据等 2、中断输入 (必选) 传输从设备到主机的输入数 据 3、中断输出 (可选 )传输从主机到设备的输出数 据

Lingoes使用教程

Lingoes使用教程

开始使用Lingoes 是一款专业的词典与文本翻译工具,但同时也是非常简明易用,将复杂的功能包含在简洁的用户界面设计中,用户只要打开Lingoes窗口,输入单词,然后按下“Enter”键,软件就会自动地帮你进行查找,并返回正确的翻译结果。

Lingoes另一项创新的技术就是“屏幕取词”功能,用户只需将鼠标移动到屏幕中的任何有单词的位置,按下“Ctrl + 鼠标右键”,Lingoes就能智能地识别出该单词,即时弹出迷你窗口显示翻译结果,你甚至还可以听到单词的读音。

这一切都是自动的,也不会干扰到你当前正在进行的工作。

对于普通的用户,无需任何学习,就可以凭直观的操作来使用Lingoes,如果你希望更进一步地了解Lingoes的工作原理,对软件进行更高级的个性化设定,请继续阅读下面对各个功能的详细使用说明。

词典Lingoes采用了软件与词典分离的开放式架构,软件本身作为一个提供查询本地或联机词典的功能平台,由用户根据自已的需要下载词典安装使用。

Lingoes有二种类型的词典, 为Lingoes提供了丰富的内容l 本地词典:词典数据安装在本地硬盘上,可以随时使用。

l 联机词典:是由在线词典服务商提供的查询服务,需要连接网络才能使用。

Lingoes所有的功能都是围绕着词典来进行,在“词典管理”窗口中,用户可以查看词典的属性,安装、删除词典,调整词典的排列顺序,启用或禁用词典等。

用户还可以根据不同的用途,分将词典加入到“索引组”、“取词组”中,为索引提示和取词功能提供支持。

1. 词典安装列表:所有已安装的词典都会显示在词典安装列表中,并且在Lingoes主窗口中查询单词的详细解释时,将会对词典安装列表中的词典进行查询。

2. 索引组:其中的词典用于输入单词时,提供索引提示功能。

3. 取词组:其中的词典用于在取词时查询单词的解释,在迷你窗口中查询单词时亦使用该组中的词典。

查询单词词典查询功能作为Lingoes最核心的功能,具有索引提示、查找词条和词组、单词变形识别、相关词匹配等专业查询技能。

屏幕取词翻译

屏幕取词翻译

屏幕取词翻译
随着互联网的发展,世界各地的人们日益依赖于网络的交流,而不同的语言正是网络交流过程中常见的障碍。

受到这些障碍的限制,很多人选择使用机器翻译,帮助他们浏览大量外文内容,以帮助他们更好地理解内容。

而屏幕取词翻译技术就是其中最值得关注的之一。

屏幕取词翻译就是将屏幕上某一字或一句话拿出来,然后将其翻译成目标语言,从而使人们可以更好地理解所阅读的内容。

屏幕取词翻译技术广泛应用于浏览器、搜索引擎、电子书、视频等场景,可以大大提高人们的阅读体验,减轻他们由于语言障碍带来的理解困难。

屏幕取词翻译技术的实现原理主要分为以下几个步骤:
首先,程序会自动获取屏幕上某一字或一句话,并将其发送到服务器。

接着,服务器会通过智能语言处理引擎,将源语言转换为目标语言。

最后,处理完毕的目标语言将会被发送到客户端,然后客户端就可以通过屏幕取词翻译技术将其显示出来。

当前,屏幕取词翻译技术的发展比较迅速。

百度翻译、腾讯翻译、有道翻译等都推出了屏幕取词翻译功能,使用上也比较方便,而且翻译结果也不错。

从而使得更多的人可以利用它们浏览大量外文内容,提高自己的阅读体验。

同时,屏幕取词翻译技术还有一些不足之处,比如翻译准确性不够、翻译效率低等。

不过,随着语言识别、自然语言处理技术的发展,
屏幕取词翻译技术也会越来越完善,从而帮助更多的人理解外语内容。

总的来说,屏幕取词翻译技术给大家带来了极大方便,帮助我们解决了语言障碍带来的困扰,让我们可以更好地欣赏外语文化。

鼠标指针的原理

鼠标指针的原理

鼠标指针的原理鼠标指针的原理是通过感应器或光学技术捕捉鼠标在工作表面上移动时的变化,并将这些变化转化为计算机可以理解的信号,从而实现对计算机界面上光标的控制。

鼠标指针的原理包括机械结构、传感器技术、信号处理等方面。

下面将逐一进行详细解释。

首先,机械结构是鼠标指针实现的基础。

通常来说,鼠标由一个外壳和一个可移动的球组成。

球位于外壳底部,当鼠标在平面上移动时,球将带动支撑它的小滚轮旋转。

这个小滚轮位于一个悬臂臂上,而这个悬臂臂上装有两个旋转编码器,称为X轴编码器和Y轴编码器。

其次,传感器技术是鼠标指针实现的关键。

鼠标的传感器通常是由光电元件构成的。

光电元件的最常见类型是光电二极管和光敏二极管。

通常情况下,鼠标底部有一个小孔,光线通过这个小孔射向工作表面,并被表面反射回来。

当鼠标移动时,由于表面的不同特性,射入光线的角度和强度也会发生变化,这些变化被光电元件感应到。

接下来,信号处理是鼠标指针的重要环节。

传感器感应到的光电信号被传送到鼠标的电路板上,然后通过电路来处理。

在鼠标电路板上,有一个信号放大器,用于增强由光电元件所接收到的微弱光电信号。

信号放大器将鼠标移动过程中感应到的信号转化为电压信号,这个电压信号通过电线传送到计算机主机。

最后,计算机主机通过读取鼠标所发送的电压信号来解析并计算鼠标的移动速度和方向。

计算机主机接收到电压信号后,会经过一系列的数学计算和处理,将电压信号转换为对应光标在计算机屏幕上移动的位移,并将其实时更新。

根据计算机主机接收到的电压信号的变化,光标在屏幕上的位置也会发生相应的变化。

总结起来,鼠标指针的原理是通过机械结构、传感器技术和信号处理等方面的协同作用,实现对鼠标在工作表面上移动的识别和转化为计算机可以理解的信号,从而实现对计算机界面上光标的控制。

在日常使用中,鼠标指针的原理使得计算机操作更加方便和高效。

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

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

当你用Word在处理文档的过程中遇到了不认识的英文单词时,大概首先会想到使用电子词典,但是不巧电脑中又没有装。

其实Word中就自带了不错的文档翻译功能,而在最新的Word 2010中,除了以往的文档翻译、选词翻译和英语助手之外,还加入了一个翻译屏幕提示的功能,可以像电子词典一样进行屏幕取词翻译。

使用Word 2010打开一篇带有英文的文档,切换到审阅选项卡,单击翻译,选择下拉菜单中的翻译屏幕提示。

现在只要将鼠标指向一个单词或一个选定的短语,就会弹出一个浮动窗口显示翻译结果,不过此时这个窗口是半透明效果的,很难看清上面的文字。

小编猜测这应该是为了避免鼠标在文档中划过时会不断弹出翻译窗口影响阅读而设计的,因此想要看清窗口中的字,只要将鼠标移动到浮动窗口上就可以了。

安卓平板鼠标悬停取词

安卓平板鼠标悬停取词

安卓平板鼠标悬停取词【原创实用版】目录1.安卓平板电脑简介2.鼠标悬停取词功能概述3.安卓平板鼠标悬停取词实现方法4.安卓平板鼠标悬停取词的优点与不足5.未来发展趋势正文一、安卓平板电脑简介安卓平板电脑是一种运行安卓操作系统的平板电脑,具有便携性强、功能丰富、触控操作等特点。

近年来,随着科技的发展,安卓平板电脑在硬件性能和软件应用上不断完善,被广泛应用于学习、办公、娱乐等领域。

二、鼠标悬停取词功能概述鼠标悬停取词功能是指当鼠标悬停在文本上时,可以选中并提取文本中的某个词或短语。

这项功能对于提高文本编辑、阅读效率具有重要意义。

在计算机上,这一功能早已实现,而在安卓平板电脑上,也逐渐有应用将这一功能进行优化和改进。

三、安卓平板鼠标悬停取词实现方法在安卓平板电脑上实现鼠标悬停取词功能,需要结合硬件设备和软件应用两方面。

首先,需要一款支持悬停取词功能的鼠标,例如蓝牙鼠标。

其次,需要在平板电脑上安装一款支持此功能的输入法或浏览器等应用。

在实际操作中,用户只需将鼠标悬停在文本上,即可实现取词功能。

四、安卓平板鼠标悬停取词的优点与不足鼠标悬停取词功能在安卓平板电脑上的应用,具有以下优点和不足:1.提高阅读效率:用户在阅读电子书、网页等文本时,可以快速选取关键词,便于复制、搜索等操作。

2.减少操作步骤:相较于手动选取文本,悬停取词功能简化了操作流程,提升了用户体验。

3.不足之处:目前,安卓平板鼠标悬停取词功能在兼容性和稳定性方面仍有待提高。

部分应用可能不支持此功能,导致用户体验不佳。

五、未来发展趋势随着科技的发展和人们对便捷性的需求,安卓平板鼠标悬停取词功能在未来将得到更广泛的应用。

从屏幕抓词的技术实现

从屏幕抓词的技术实现

从屏幕抓词的技术实现周天舒1999/6/22前言:现在的即时翻译软件种类很多,使用方法也各有千秋,但它们大都有一个共同的特点:鼠标指到哪儿,就翻译它下面的单词。

这大大地方便了用户,但是从一个编程人员的角度来看就不那么轻松了。

因为没有一个方便的函数类似”GetWordUnderMouse()”可以得到鼠标下面的单词,那么这些软件是怎么做的呢?经常在BBS和mailing list里看到和我同样困惑的问着相同问题的网友们。

经过痛苦地研究后,我找到了一种实现的方法,现拿出来和大家共享。

注:这个程序是为NT定做的,只能在NT下运行。

技术概述:屏幕上的大多数文字都是由gdi32.dll的以下几个函数显示的:TextOuA,TextOutW,ExtTextOutA,ExtTextOutW。

象user32.dll中的DrawTextA,DrawTextW都是调用GDI32.DLL的这几个函数实现的。

其实大家都知道实现屏幕抓词的关键是如何截获对这几个函数的调用。

我从易到难简要描述一下实现抓词需要做的几件事:一、得到鼠标的当前位置。

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

三、截获对系统函数的调用,得到发给系统函数的参数。

下面我对每一条逐个详细描述。

实现步骤相关技术的详细描述:一、得到鼠标的当前位置只要装入一个WH_MOUSE类型的系统钩子,就可以截获所有的鼠标消息。

SetWindowsHookEx(WH_MOUSE, //钩子类型(HOOKPROC)MouseProc, //回调函数GetModuleHandle("hookdll.dll"), //我的动态库0); //标明是系统钩子在回调函数里:if ( wParam == WM_MOUSEMOVE ) {lpMouseHookStruct = (LPMOUSEHOOKSTRUCT)lParam;MousePoint=lpMouseHookStruct->pt; //这就是鼠标的当前位置}二、向鼠标下的窗口发重画消息,让它调用系统函数重画。

屏幕抓词原理及其实现方法

屏幕抓词原理及其实现方法

第26卷 第4期2008年12月 贵 州 科 学GU IZHO U SC IENC E Vol.26,No .4Dec .2008收稿日期作者简介冀肖榆(%),男,5级研究生李丹宁,贵州科学院副院长,硕士生导师屏幕抓词原理及其实现方法冀肖榆1,赵廷义2,李丹宁2(1.贵州大学 电子技术与信息技术学院,贵州 贵阳 550025;2.贵州科学院,贵州 贵阳 550001)摘 要 本文介绍了W indo ws 2000/XP 下屏幕抓词的原理,对其如何获得鼠标位置的字符串,从代码拦截、鼠标HOOK 、屏幕刷新等方面进行了讨论.最后分析了通过本方法取词的局限性.关键词:屏幕取词;Hook;代码拦截中图分类号 TP391.1 文献标识码 A 文章编号 1003-6563(2008)04-0045-04THE P R INC IPL E AN D I M PL E M ENTAT I O N O F GRASP INGWO RDSJI Xiao -yu 1,ZHAO Ting -yi 2,L I D an -ning 2(1.College of Electroni c Sc ience and Infor m ati on T echn ology,Guizhou U nive rsity,Guiyang 550025;2.GuizhouAcademy of Sc iences,G uiyang 50001)ABSTRAC T This article intr oduced the princ i p l e of gras p ing words in W indo ws 2000/XP 1W e discussed theaspects of code intercepti on,mouse HOOK,and screen refurbis hing on h ow t o ge t charac ter a round t he mouse .F i nall y,we analyzed the li m itations of the gra s p i ng word based on the me th od .KEY W O RD S gras p ing word;H OOK ;AP I interception1 概述屏幕抓词的关键是如何获得鼠标位置的字符串,W indow s 的动态链接和消息响应机制为之提供了实现途径[3].概括地说,主要通过下面的几个步骤来取得屏幕上鼠标位置的字符串:代码拦截:W indows 以DLL 方式提供系统服务,可以方便地获取W indows 字符输出A P I 的地址,修改其入口代码,拦截应用程序对它们的调用.鼠标HOOK :安装WH _MOUSE 类型的全局鼠标HO O K 过程,监视鼠标在整个屏幕上的移动.屏幕刷新:使鼠标周围一块区域无效,并强制鼠标位置的窗口刷新屏幕输出.窗口过程响应WM_P A I N T 消息,调用ExtText Out 等字符输出AP I 更新无效区域里面的字符串.这些调用被我们截获,从堆栈里取得窗口过程传给字符I 的参数,如字符串地址、长度、输出坐标、D 、裁剪区等信息:2008-04-22:1982200..AP H C .2 原理分析在W indows2000/XP 系统中,屏幕上的大多数文字都是由gdi32.dll 和user32.dll 中的几个函数[1]显示的:Text O ut A ,Text Out W ,ExtText Out A ,ExtText Out W ,D ra wText W ,D ra wText A.其调用关系如图1所示.图1 字符输出F i g .1 C ha ra c te r o ut p ut 从上图可以看出,无论是通过那个字符输出函数,最终应用程序都会通过G D I 32.dll 的ExtText Out A 和ExtText O ut W 把字符输出到屏幕上.其中ExtText O ut A 输出ANS I 格式的字符,ExtText O ut W 输出U N I CODE 格式的字符;因此,只要拦截2个函数:ExtText Out A 和ExtText Out W ,就能截获应用程序的所有字符串输出.3 实现本文将用Delphi 实现在W indows2000/XP 系统下的屏幕抓词,以下是实现步骤及关键的伪码.图2 屏幕抓词实现F i g .2 R ea li z i ng t he g ra sp i ng wo rd s3.1 拦截字符输出AP I3 代码拦截的基本思路为了实现对x T xO x T xO W 等I 的拦截,需要在函数入口放入一条动态生成的“M <替代函数>”指令,M 的操作数是我们提供的一个拦截替代函数的地址[]当该I 被调用时,M 指令首64贵 州 科 学 26卷 .1.1E t e t ut A /E t e t ut A P J P J P 2.AP J P先执行,跳转到替代函数.替代函数负责从堆栈中获取参数,计算字符串坐标,分出鼠标位置的单词等工作.执行完成后,替代函数再调用原来的被拦截函数,完成正常的字符输出,然后返回.图2(a )表明了应用程序对Text Out 的正常调用流程,图2(b )是系统Text Out 被拦截后的流程.3.1.2 构造拦截替代函数拦截替代函数插入被拦截AP I 的流程中执行,需要有相同的参数和返回值原型.以对Text O utExt A 的拦截为例,下面是替代函数myText O utExt A 的D el phi 关键代码:Boolean m yExtText Out (H DC hdc,integer x,y,LPSTR l p str,integer cbstr ){ DoS py (hDC ,x ,y,lpstr,cbstr ); //保存参数,作抓词的所有工作 Restor eCode ();//恢复Text Out 入口原来的指令 Text Out (hDC ,x,y,l p str,cbstr );//调用原来的AP I SpyCode ();//再次放入JMP 指令 return TRUE;}函数首先调用DoSpy ()来作抓词的具体工作,然后R est oreCode ()函数恢复被拦截函数入口的代码,再调用Text O ut ()执行正常的字符输出,接下来S pyCode ()在被拦截函数入口再次放入JMP 指令,最后返回调用进程.3.1.3 获取被拦截AP I 的动态链接地址ExtText O ut W /ExtText Out A 的地址可以通过G e tPr oc Addr e ss 取得,以myExtText Out 为例的De l phi 伪码如下:Va r pSysFunc:Pointer; //系统函数的地址pSysFunc :=G e tPr ocAddr e ss (Get M oduleHandle (’gdi .dll ’),’ExtText O ut A ’);3.1.4 动态生成J MP 指令动态生成的J MP 指令占用5个字节,保存在一个TCode5记录内.以生成跳转到m yExtText Out A 的替代函数m yExtText Out 的JMP 指令为例的De l phi 关键代码如下:Va r pThunkFunc: Pointer ; //替换函数的地址 code B ak: TCode5;//系统函数的代码的前5个字节 codeThunk: T Code5;//替换函数的代码的5个字节pT hunkFunc :=GetP r oc Address (hI nstance,’m yExtText Out A ’);c ode B ak.siJmp :=P B yte (pSysFunc)^;c ode B ak.dw Addr :=P D WORD (D WORD (pSysFunc)+1)^;c odeThunk.si Jmp :=ShortInt (S _E9);c odeThunk.dw Addr :=D WORD (pThunkFunc )-D WORD (pSysFunc )-5;3.1.5 修改被拦截函数的入口修改ExtText Out W /ExtText Out A 的入口以便系统调用这两个函数的时候能重定向到自己的代码m yExt 2Text Out W /m yExtText Out A,可以通过W ritePr ocess Me mory 进行修改,该AP I 可以把指定长度的代码拷贝到指定进程地址空间中[2].关键代码如下:W ritePr oce ss Memor y (hPr oc,pSysFunc,@codeThunk,5);上面的语句表示把codeThunk 中前五位代码(即替换函数m yExtText Out 的入口地址)拷贝到pSysFunc 进程空间(即系统函数x T xO 的入口地址)中,即完成对x T xO 等I 的拦截修改3 使用OO K 监视鼠标移动安装一个W _MOUS 类型的全局OOK,就可以截获所有的鼠标消息[]每当有鼠标事件产生,OOK74 4期 冀肖榆,等:屏幕抓词原理及其实现方法E t e t ut E t e t ut AP ..2H H E H 4.H84贵 州 科 学 26卷 过程被调用,它判断出鼠标移动了后,就向主窗口发送消息,通知主窗口鼠标位置发生了变化.该全局H OOK 过程需要放入DLL里面.只要装入一个WH_MOUSE类型的系统钩子,关键代码如下:Set W indow s HookEx( W H_MOUSE, //钩子类型 (HOOK PROC)MouseP r oc,//回调函数 Get ModuleHandle("hookdll.dll"),//我的动态库0);//标明是系统钩子,即拦截所有消息在回调函数里:if(wPara m=WM_MOUSE MOVE)then beginl pMouseHookStruct:=(LP MO USEHOOKSTRUCT)lPara m;MousePoint:=l pMouseHookStruct->p t; //这就是鼠标的当前位置End;3.3 刷新屏幕输出根据鼠标位置(更确切说是需求取词的位置)构造一个矩形区域,然后调用I nva lidateR ect使得该区域无效,强制目标窗口刷新屏幕输出.在响应WM_P A I N T系统消息中,目标窗口对字符输出A PI(ExtText Out W/ ExtText O ut A)的调用将被我们截获和处理,完成一次抓词过程.如下是关键代码:Va r r ect:TR ECT; //使之无效的矩形区域ScreenToC lient(hwnd,&MousePoint);//转换坐标rec t.left:=MousePoint.x;//根据要取词的位置构造无效矩形区域rec t.t op:=MousePoint.y;rec t.right:=MousePoint.x+1;rec t.bott om:=MousePoint.y+1;I nvalidateR ect(hwnd,@r ect,F ALSE);//使之无效4 局限性分析安装钩子的抓词方式是目前最流行的方式,这种技术是基于应用程序调用W indows系统ExtText Out输出字符的原理,若是应用程序有自己特定的字符输出机制,不通过ExtText Out输出,则钩子方式是无法截获缓冲区的字符的.典型的应用就是Acr obat R eader.由于上述的局限性,可以考虑把OCR技术应用到屏幕抓词中,即直接读取屏幕一块区域为图片并进行文字识别,但效率问题一直未能得到比较好的解决.参考文献[1] John Ayres.Del p hi W in32核心AP I参考[M].北京:中国电力出版社,2004.[2] R I CHT ER J.W indo w s核心编程[M].北京:北京机械工业出版社,2000,299~309.[3] 陈小辉.钩子技术在信息窥探中的使用[J].计算机与现代化,2006,9:97~99.[4] 熊志勇.利用Hook技术实现屏幕热区[J].电脑编程技巧与维护,2002,12:17~18.。

cr的工作原理

cr的工作原理

cr的工作原理标题:CR的工作原理引言概述:CR(字符识别)是一种通过计算机技术将印刷或手写的字符转化为可识别的文本的技术。

它在现代信息处理中起着重要作用。

本文将详细介绍CR的工作原理。

一、光学字符识别(OCR)1.1 光学扫描:CR系统使用光学扫描仪将纸质文档转化为数字图像。

1.2 预处理:对扫描的图像进行预处理,包括去噪、增强对比度等操作,以提高字符识别的准确性。

1.3 特征提取:通过分析图像中的特征点、轮廓和线条等信息,提取出字符的特征,为后续的识别做准备。

二、手写字符识别(HCR)2.1 数据采集:通过电子手写板或触摸屏等设备,获取手写字符的轨迹数据。

2.2 特征提取:对手写字符的轨迹数据进行特征提取,例如笔画的起始点、结束点、方向等。

2.3 模式匹配:将提取到的特征与事先建立的模板进行匹配,找出最相似的字符。

三、语音识别(SR)3.1 声音采集:通过麦克风等设备,将语音信号转化为数字信号。

3.2 特征提取:对语音信号进行分析,提取出声音的频率、强度等特征。

3.3 模式匹配:将提取到的特征与事先建立的语音模型进行匹配,识别出对应的文字。

四、机器学习在CR中的应用4.1 训练数据集:CR系统需要大量的训练数据集来建立模型,包括各种字体、大小、倾斜度等。

4.2 特征选择:机器学习算法可以自动选择最相关的特征,提高字符识别的准确性。

4.3 模型训练和优化:通过训练数据集,使用机器学习算法建立模型,并通过优化算法提高模型的性能。

五、应用领域5.1 文字识别:CR在数字化图书馆、档案管理等领域中广泛应用,将纸质文档转化为电子文本,方便存储和检索。

5.2 车牌识别:CR可以自动识别车牌号码,用于交通管理、停车场管理等场景。

5.3 手写输入:CR技术在智能手机和平板电脑上的手写输入中得到广泛应用,提高了用户的输入体验。

结论:CR的工作原理涉及光学字符识别、手写字符识别、语音识别等多个方面。

通过光学扫描、特征提取和模式匹配等步骤,CR能够准确地将印刷或手写的字符转化为可识别的文本。

屏幕文字抓取工具DWMouse1.3-电脑资料

屏幕文字抓取工具DWMouse1.3-电脑资料

屏幕文字抓取工具DWMouse1.3-电脑资料
提供图片截取、文字捕获等主要功能,。

截图支持多种方式抓取:矩形、椭圆、心形、任意形状,截图结果可自动保存到剪贴板或者文件,文件支持BMP/JPG/WMF/PNG/EMF等常用格式;文字捕获可抓取电脑上显示在任何地方的文字,比如网页、桌面、窗体等,电脑资料
《屏幕文字抓取工具DWMouse1.3》(https://www.)。

工作时无界面,都是用鼠标动作完成截图和文字抓取。

注意:
1. 小软不是基于OCR识别,所以不要指望能把图片上的文字抓下来,但是非图片文字基本都没问题;
2. 默认抓取的结果在剪贴板上,莫要问我截到哪里去了。

这款小软件使用上比较简单,容易上手,适合大众,不适合专家使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Win9X中为16位操作系统保留了0到4MB的地址空间,而在4MB到2GB之间也就是Win32进程私有的地址空间,由于 每个进程的地址空间都是相对独立的,也就是说,如果程序想截获其它进程中的API调用,就必须打破进程边界墙,向其它的进程中注入截获API调用的代码,这项工作我们交给钩子函数(SetWindowsHookEx)来完成,关于如何创建一个包含系统钩子的动态链接库,《电脑高手杂志》已经有过专题介绍了,这里就不赘述了。
说到这里,我们有必要介绍一下PE文件的格式,如右图,这是PE文件格式的大致框图,最前面是文件头,我们不必理会,从PE File Optional Header后面开始,就是文件中各个段的说明,说明后面才是真正的段数据,而实际上我们关心的只有一个段,那就是“.idata”段,这个段中包含了所有的引入函数信息,还有IAT(Import Address Table)的RVA(Relative Virtual Address)地址。
所有系统钩子的函数必须要在动态库里,这样的话,当进程隐式或显式调用一个动态库里的函数时,系统会把这个动态库映射到这个进程的虚拟地址空间里,这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈,也就是说动态链接库中的代码被钩子函数注入了其它GUI进程的地址空间(非GUI进程,钩子函数就无能为力了),当包含钩子的DLL注入其它进程后,就可以取得映射到这个进程虚拟内存里的各个模块(EXE和DLL)的基地址,如:
先说Windows虚拟内存的管理。Windows9X给每一个进程分配了4GB的地址空间,对于NT来说,这个数字是2GB,系统保留了2GB到 4GB之间的地址空间禁止进程访问,而在Win9X中,2GB到4GB这部分虚拟地址空间实际上是由所有的WIN32进程所共享的,这部分地址空间加载了共享Win32 DLL、内存映射文件和VXD、内存管理器和文件系统码,Win9X中这部分对于每一个进程都是可见的,这也是Win9X操作系统不够健壮的原因。
系统将EXE和DLL原封不动映射到虚拟内存空间中,它们在内存中的结构与磁盘上的静态文件结构是一样的。即PE (Portable Executable) 文件格式。我们得到了进程模块的基地址以后,就可以根据PE文件的格式穷举这个模块的IMAGE_IMPORT_DESCRIPTOR数组,看看进程空间中是否引入了我们需要截获的函数所在的动态链接库,比如需要截获“TextOutA”,就必须检查“Gdi32.dll”是否被引入了。
HMODULE hmodule=GetModuleHandle(“Mypro.exe”);
在MFC程序中,我们可以用AfxGetInstanceHandle()函数来得到模块的基地址。EXE和DLL被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址是在链接时由链接器决定的。当你新建一个Win32工程时,VC++链接器使用缺省的基地址0x00400000。可以通过链接器的BASE选项改变模块的基地址。EXE通常被映射到虚拟内存的0x00400000处,DLL也随之有不同的基地址,通常被映射到不同进程的相同的虚拟地址空间处。
Private Const WM_GETTEXT = &HD
Private Const WM_SETTEXT = &HC
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim Shu As POINTAPI
2. 得到鼠标的当前位置,向鼠标下的窗口发重画消息,让它调用系统函数重画窗口。
使用到的API函数:WindowFromPoint,ScreenToClient,InvalidateRect
3. 截获对系统函数的调用,取得参数,也就是我们要取的词。
对于大多数的Windows应用程序来说,如果要取词,我们需要截获的是“Gdi32.dll”中的“TextOutA”函数。
第一种:采用截获对部分GDI的API调用来实现,如TextOut,TextOutA等。
第二种:对每个设备上下文(DC)做一分Copy,并跟踪所有修改上下文(DC)的操作。
第二种方法更强大,但兼容性不好,而第一种方法使用的截获WindowsAPI的调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用WindowsAPI拦截技术,你可以改造整个操作系统,事实上很多外挂式Windows中文平台就是这么实现的!而这项技术也正是这篇文章的主题。
说到这里,截获WindowsAPI的整个原理就要真相大白了。实际上所有进程对给定的API函数的调用总是通过PE文件的一个地方来转移的,这就是一个该模块(可以是EXE或DLL)的“.idata”段中的IAT输入地址表(Import Address Table)。在那里有所有本模块调用的其它DLL的函数名及地址。对其它DLL的函数调用实际上只是跳转到输入地址表,由输入地址表再跳转到DLL真正的函数入口。
Private Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
截WindowsAPI的调用,具体的说来也可以分为两种方法:
第一种方法通过直接改写WinAPI 在内存中的映像,嵌入汇编代码,使之被调用时跳转到指定的地址运行来截获;第二种方法则改写IAT(Import Address Table 输入地址表),重定向WinAPI函数的调用来实现对WinAPI的截获。
// 然后调用正版的TextOutA函数
}
把这个函数放在安装了钩子的动态连接库中,然后调用我们最后给出的HookImportFunction函数来截获进程对TextOutA函数的调用,跳转到我们的MyTextOutA函数,完成对输出字符串的捕捉。
HookImportFunction的用法:
我们先仿照TextOutA函数写一个自己的MyTextOutA函数,如:
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
// 这里进行输出lpszString的处理
Dim Str As String * 300
GetCursorPos Shu
SendMessage WindowFromPoint(Shu.x, Shu.y), WM_GETTEXT, 299, ByVal Str
Me.Caption = Str
End Su面更有难度,这是因为虽然微软说WIN16的API只是为了兼容性才保留下来,程序员应该尽可能地调用32位的API,实际上根本就不是这样!WIN 9X内部的大部分32位API经过变换调用了同名的16位API,也就是说我们需要在拦截的函数中嵌入16位汇编代码!
鼠标屏幕取词技术的原理和实现
[ 录入者:mmcbbs | 时间:2005-04-10 05:37:13 | 作者:mmcbbs | 来源: | 浏览:125次 ]
“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在WINDOWS系统中实现却是非常复杂的,总的来说有两种实现方式:
我们将要介绍的是第二种拦截方法,这种方法在Win95、98和NT下面运行都比较稳定,兼容性较好。由于需要用到关于Windows虚拟内存的管理、打破进程边界墙、向应用程序的进程空间中注入代码、PE(Portable Executable)文件格式和IAT(输入地址表)等较底层的知识,所以我们先对涉及到的这些知识大概地做一个介绍,最后会给出拦截部分的关键代码。
下面给出了HookImportFunction的源代码,相信详尽的注释一定不会让您觉得理解截获到底是怎么实现的很难,Ok,Let’s Go:
////////////////////////
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
HOOKFUNCDESC hd;
PROC pOrigFuns;
hd.szFunc="TextOutA";
hd.pProc=(PROC)MyTextOutA;
HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);
讲了这么多原理,现在让我们回到“鼠标屏幕取词”的专题上来。除了API函数的截获,要实现“鼠标屏幕取词”,还需要做一些其它的工作,简单的说来,可以把一个完整的取词过程归纳成以下几个步骤:
1. 安装鼠标钩子,通过钩子函数获得鼠标消息。
使用到的API函数:SetWindowsHookEx
具体来说,我们将通过IMAGE_IMPORT_DESCRIPTOR数组来访问“.idata”段中引入的DLL的信息,然后通过IMAGE_THUNK_DATA数组来针对一个被引入的DLL访问该DLL中被引入的每个函数的信息,找到我们需要截获的函数的跳转地址,然后改成我们自己的函数的地址……具体的做法在后面的关键代码中会有详细的讲解。
相关文档
最新文档