当前位置:首页 » 操作系统 » 屏幕取词源码

屏幕取词源码

发布时间: 2022-06-13 10:41:26

A. 英文不好怎样看英文网页

google 提供在线翻译 可以 试试
也可以安装金山词霸之类的翻译软件

问题补充回答:网络里搜 翻译软件 ,多的是!翻译软件只能翻译文字性的东西,软件是经过编译打包的怎么可能被翻译,如果你要翻译,也首先要反编译,拿到它的源码,再进行!

B. 请教关于用python编写屏幕取词的程序问题

1、屏幕取词技术实现原理与关键源码----
Ubuntu 下可以监视 gtk.Clipboard 来获取当前选中文字和位置。

我以前尝试过定时抓取鼠标附近图像做 OCR 来取词,
改成快捷键取词会省一点。

直接获得文字的悬停取词比较麻烦。

网页、XUL 应用程序可以有鼠标悬停事件。

X11 自己没有, 不过以前流行中文平台、中文外挂时候 Turbolinux 的中文 X-window 被修改为集成鼠标悬停取词翻译。

Gtk 程序也许你可以在 ATK 层入手,自己改 ATK 和用 LD_LIBRARY_PATH。

windows下很不好做。
普遍用的是HOOK API的方法。
可以参考stardict的取词模块。
不过我感觉stardict的取词模块也不是太好用(没金山词霸的好用),感觉有bug。

似乎以前某版本的金山词霸可以翻译图片中的文字,就是用 OCR

再,金山似乎出过 Linux Qt3 版本,找 Zoomq 几位在金山的老大索取源码看看吧

嗯, 金山词霸确实出过 Linux 版本,

是基于 wine 的,不是原生的 Linux 版本...

linux下就不知道,windows下,应该是做一个api hook,钩住TextOut,DrawText和DrawTextEx。
要取词的时候给鼠标所在的窗口发一个WM_PAINT消息,让窗口重绘。
当窗口调用TextOut, DrawText或是DrawTextEx进行重绘的时候,你就可以根据传入的参数知道
窗口想在鼠标下画什么东西了。

C. 有开源的java屏幕取词程序吗

这样问得确不是很正确,语言没有开不开源的说法,语言只是提供给大家一种写代码要遵循的语法,当然这些语法肯定是公开的,不然大家怎么学呀。
至于用java这个语法写的代码是否是开源的,那每个项目都不同,有开源的也有商业的;
如果你想问的是java的基本类库是否开源,那答案是是的,你安装完jdk后目录下会有src.zip,里面就是源代码;

D. 推荐一些常用电脑软件

http://www.seekerbase.com/bbs/dispost.asp?BoardID=36&PostID=8219&Page=0

WinRAR v3.42 简体中文注册版 V3.50 Beta 7流行好用的压缩工具,支持鼠标拖放及外壳扩展,完美支持 ZIP 档案,内置程序可以解开 CAB、ARJ、LZH、TAR、GZ、ACE、UUE、BZ2、JAR、ISO 等多种类型的压缩文件;压缩率相当高,具有分卷压缩、制作自解压文件、加密压缩等功能

=====下载工具=====

点此下载—FlashGet v1.65 国际版 v1.65 注册机1.65 注册码:fgf- 大名鼎鼎的多任务多线程断点续传下载管理器,被誉为国内王牌下载工具。可以说是一个集速度与管理于一身的下载软件。其最大的特点就在于对下载文件的管理,通过JetCar下载的文件可按树状结构分门别类的保存起来,新版本已经支持MMS、RTSP等流媒体文件下载

Net Transport v1.94c提起下载,人们马上就会想到NetAnts、FlashGet等传统的下载利器。它们凭借着断点续传和多线程下载等实用功能而闻名于世。可是,随着宽带的普及就渐渐显出了疲态。宽带一话不再满足于在WEB或者是ftp服务器上下载文件。流媒体成了他们新的话题。网上广泛流传的流媒体下载工具是Stream VCR,可是它只支持单线程下载,使得下载速度大大减慢。Net Transport支持HTTP、FTP、MMS和RSTP协议,除了RSTP协议外,对于其他的协议均能实现多线程的断点续传

PUB Downloader v1.6 简体中文版 所谓PUB就是Public ftp的简称,您常在下载文件碰到需要使用PUB Downloader软体下载时,是不是就没辄了呢!不要怕!就是使用此软体来下载一些经过转换保护的Public ftp服务器内的文件。使用方法:先将密码网址复制贴到密钥输入栏里,按连线完后点选左上角资料指定下载到何处,再选择pub里你欲下载的档案再按play键即可

eMule 简体中文版 0.46a VeryCD Build 0611

eMule 0.45b CN-4 Bulid 159 中文安装版(中国驴)推荐使用中国驴的Mod eMule是以eDonkey2000网络为基础的新型P2P文件分享工具,不但提供了所有eDonkey的标准功能,还提供了许多额外的功能,比如支持上榜、证书等,因而受到许多网友的喜爱

KuGoo(酷狗) 2.052 KuGoo是国内最大的P2P音乐共享软件,拥有超过数亿的共享文件资料,深受全球用户的喜爱,拥有近千万使用用户。 最新的V2版本给予用户更多的人性化功能,实行多源下载,提升平时的下载速度,经测试,最快可以达到500K/S,更快更高效率的下载搜索的歌曲。国内最先提供在线试听功能,方便用户进行选择性的下载,减少下载不喜欢的歌曲哦。娱乐主页每天会提供大量最新的娱乐资讯,欧美、中文和日韩的最新大碟,单曲排行下载让你轻松掌握最前卫的流行动态,充分享受KuGoo和您的精彩娱乐生活。 酷狗具有强大的搜索功能,支持用户从全球KUGOO用户中快速检索所需要的资料,还可以与朋友间相互传输影片、游戏、音乐、软件、图片。 快速下载功能:KUGOO拥有强大的网络连接功能,支持局域网、外网等各种网络环境,支持断点续传,实现超高速下载,。 KuGoo具备了的聊天功能,并且可以与好友共享传输文件,让聊天,音乐,下载变得更加互动,还附带多功能的播放器。 文件共享让您可以立即与伙伴之间共同分享自己电脑里的文件、数据、音乐等等。为你建立一个自由、自主、安全的世界局域网。

=====BT工具====

BitTorrent Plus! II 正式版 1.2 一个多点下载且源码公开的P2P软件,使用非常方便,就像一个浏览器插件。与以往http、FTP、 pub等下载人越多,速度越慢的方式迥然不同,BT下载的特点简单的说就是:下载的人越多,速度越快。时下BT已经成为网上交流资源最新、最酷的方式

BitComet 0.59 稳定版推荐BT用户使用,对内网用户尤其适用 BitComet是基于BitTorrent协议的p2p文件分享免费软件,支持多任务下载,文件有选择的下载;磁盘缓存,减小对硬盘的损伤;只需一个监听端口,方便手工防火墙和NAT/Router配置;在WindowsXP下能自动配置支持Upnp的NAT和XP防火墙,续传做种免扫描,速度限制等多项实用功能,以及自然方便的使用界面

BitSpirit 比特精灵 多国语言版 3.0.1.090 正式版 比特精灵(BitSpirit)是一款完全免费、高速稳定、功能强大、简单易用的BT下载软件。自发布以来以其稳定高速,功能强大,使用人性化的特点,日益受到广大用户的青睐

贪婪BT(GreedBT) v2.7.1 多语言版 贪婪BT(ABC)是在 The Shad0w''''''''s Bittorrent experimental S-5.7.6 的基础上改进而来。The Shad0w''''''''s Bittorrent experimental则是在原始的Bittorrent上改进而来。贪婪BT是应该说是超强的Bittorrent客户端,单窗口多任务,资源消耗少。ABC是一个非常棒的单窗口BT客户端,稳定,占内存非常小,速度快

=====中文输入工具=====

拼音加加 3.11 正式版 3.11 增强版

紫光拼音输入法增强版 4.0 m3 build 2

微软拼音输入法 2003 官方正式增强版

极点中文 v4.4 正式版

龙文输入平台 v3.93正式版 优秀汉字输入软件,五笔、拼音混合输入,无需切换,自动加词、反查编码等功能可以使你输入效率更高,免费使用

智能陈桥五笔v5.601

=====FTP客户端工具==

FlashFXP v3.2.0 汉化正式版注册码在安装过程中的许可协议里面注册方法请详见汉化说明 功能强大的FXP/FTP软件,融合了一些其他优秀FTP软件的优点,如像CuteFTP一样可以比较文件夹,支持彩色文字显示;像BpFTP支持多文件夹选择文件,能够缓存文件夹;像LeapFTP一样的外观界面,甚至设计思路也差相仿佛。支持文件夹(带子文件夹)的文件传送、删除;支持上传、下载及第三方文件续传;可以跳过指定的文件类型,只传送需要的文件;可以自定义不同文件类型的显示颜色;可以缓存远端文件夹列表,支持FTP代理及Socks 3&4;具有避免空闲功能,防止被站点踢出;可以显示或隐藏“隐藏”属性的文件、文件夹;支持每个站点使用被动模式等

CuteFTP Pro v7.1.06.07 汉化版汉化包中附带 BetaMaster 的破解补丁,请自行破解最好的FTP客户程序之一,如果你是CuteFTP老版本的用户,你会发现很多有用的新特色。目录比较,宏目录上载和下载,远程文件编辑,以及IE风格的工具条等等,定会令你爱不释手

FTPRush v1.0 RC6 build 0568 着名的FTP客户端FTPRush(以前叫UltraFXP)是一个高性能的FTP客户端, 通过它你可以轻松地上传下载和FXP(Ftp服务器之间的文件传输),, 完全多线程的构造, 让你自由自在地存取FTP服务器的资源, 下面列出一些主要的特性:多站台支持、多IP地址、脚本、FTP 代理、多语言支持、容易使用、多线程内核、自动CRC校验、快速连接、站台捷径等等

=====邮件客户端工具====

Foxmail v5.0.800.0 简体中文版 国内着名的Internet电子邮件客户端软件,支持全部的Internet电子邮件功能。有中文版和英文版。中文版在国内拥有众多用户,英文版的用户遍布全球二十多个国家。真正的多用户,多帐户,多POP3支持;邮箱目录树结构,可以无限建立子邮件夹和子邮箱;不再是MDI(多文档)窗口。如写邮件窗口是独立的,可视面积更大,切换更方便等

虽说平凡得如路旁一棵草,但生命和个性总是属于自己的。
【我爱的人名花有主】
【爱我的人惨不忍睹】
【不是在放荡中变坏】
【就是在沉默中变态】

发帖时间:2005-9-3 1:18:49

标题:RE:电脑装机常用软件大全
作者:梦醒时分 [编辑] [删除] [引用] 第[2]楼

DreamMail v3.0.0.5 简体中文版 DreamMail是一款专业的电子邮件软件,用于管理和收发电子邮件,支持 Windows 98/ME/NT4/2000/XP/2003 等操作系统。它采用多用户和多帐号方式来管理电子邮件,支持SMTP、eSMTP、POP3、Hotmail、Yahoo等邮件协议,真正采用多线程高速收发邮件。附带增强型远程管理,可以直接查看服务器上邮件的内容、可以在服务器上直接删除邮件;邮件过滤器、黑名单及白名单等组合使用,能有效对付垃圾邮件;DreamMail 能自动检测破坏性邮件,增强系统安全;另外,DreamMail 还支持特快专递、语音邮件、匿名发送及群组发送等

Becky! v2.21.03 汉化版Name:crsky Code:6507-3437-f766 eMail:[email protected]

虽说平凡得如路旁一棵草,但生命和个性总是属于自己的。
【我爱的人名花有主】
【爱我的人惨不忍睹】
【不是在放荡中变坏】
【就是在沉默中变态】

发帖时间:2005-9-3 1:19:00

标题:RE:电脑装机常用软件大全
作者:梦醒时分 [编辑] [删除] [引用] 第[3]楼

=====光盘虚拟刻录工具==

Daemon Tools v3.47 汉化版 一个非常棒的虚拟光驱软件,安装后不需重起即可使用,它支持PS机格式,支持加密光盘,最大的好处是可以把从网上下载的CUE、ISO、CCD、BWT、MDF等镜像文件Mount成光盘直接使用,不需要再把他们解开了

Alcohol 120%v1.9.5 Build 2802 这个光盘刻录软件的完整解决方案,能完整的仿真原始光盘片,让你能不必将光盘映像文件刻录出来便可以使用虚拟光驱执行虚拟光盘且其效能比实际光驱更加强大;支持多种映像档案格式,你可以利用其它软件所产生的光盘映像文件直接挂载进Alcohol 120%之虚拟光驱中,便可直接读取其内容;你也可以直接将CD、DVD或光盘映像文件刻录至空白 CD-R / CD-RW / DVD-R / DVD-RW / DVD-RAM / DVD+RW 之中,而不必透过其它的刻录软件,方便你对光盘及映像文件的管理

WinISO v5.3 简体中文特别版

UltraISO Media Edition 简体中文版 7.6.1.1125

注册码在安装过程中的许可协议里面 7.5.5.1012SN:73BE-8D23-18C6-1D1D 一个类似于WinISO的ISO文件编辑工具,界面友好,方便的双窗口操作,能制作启动光盘映像。和WinISO相对比,可能制作启动光盘镜像的能力要强,而且网友反映稳定性也好于WinISO

DVDIdle Pro v5.9.3.0 多国语言版 大家经常让自己的DVD-ROM用于DVD影片播放,从头到尾勤奋的DVD得不到丝毫的休息,有时候还碰到花碟滥碟,严重影响了DVD的寿命....,而DVDIdle可以缓解这一问题,它利用了Smart Read-Ahead技术,将相关资料存储到硬盘的缓存中,以减轻DVD-ROM的工作负担,能够延长DVD-ROM的使用寿命为原来的2-8倍

=====图像浏览工具====

ACDSee PowerPark 7.0 Build 102 V7.0 Build 102汉化补丁注意:这是 ACDSee 7.0 build 102 PowerPack 的简体中文补丁,适用于 ACDSee 7.0 build 102 PowerPack 版本,也可用于标准版。安装时建议使用 Trial 模式安装,汉化后即为破解版,无需激活。 ACDSee是目前最流行的数字图象处理软件,它能广泛应用于图片的获取、管理、浏览、优化甚至和他人的分享!使用 ACDSee,你可以从数码相机和扫描仪高效获取图片,并进行便捷的查找、组织和预览,超过 50 种常用多媒体格式被一网打尽!作为最重量级看图软件,它能快速、高质量显示您的图片,再配以内置的音频播放器,我们就可以享用它播放出来的精彩幻灯片了。Acdsee 能处理如Mpeg之类常用的视频文件。此外ACDSee是您最得心应手的图片编辑工具,轻松处理数码影像,拥有的功能像去除红眼、剪切图像、锐化、浮雕特效、曝光调整、旋转、镜像等等,还能进行批量处理哦

ACDSee Classic v2.44 汉化版 高性能的看图程序,支持 BMP,GIF,JPG,TGA,TIF 等各种常见的图形文件格式,图片打开速度极快;ACDSee Classic版本并不包含太多的功能,可以说是一个纯粹的看图软件,所以要比ACDSee小得多

黄河Flash播放器 v7.63 “黄河Flash播放器”,可以播放各类Flash文件,使用不规则界面,可保存列表文件、打开开列表文件、清空列表,可以自定义列表,自动更新功能、从IE中拖放播放、IE右键播放功能等

=====屏幕截图工具====

HyperSnap-DX v5.63.00 汉化版 提供专业级影像效果,也可让您轻松地抓取屏幕画面。支持抓取使用DirectX技术之游戏画面及DVD视频,并且采用新的去背景功能让您将抓取后的图形去除不必要的背景;预览功能也可以正确地显示您的图打印出来时会是什么模样等

TechSmith SnagIt v7.22 v7.22汉化补丁Name:crsk Code:BF3909BC382BB17988 一个强大的屏幕捕捉程序,不仅能捕捉Windows下的屏幕,也能捕捉DOS的,存盘支持的图形格式也很多;它不仅可以撷取整个画面,还可以做动态影像撷取,文字撷取等,其功能之强大,让人无法想象

=====网络浏览工具====

Internet Explorer v6.0 Build 2800 简体中文完全版

MyIE2 v0.9.27.68 豪华版 Maxthon 傲游浏览器 豪华版 1.3.1 Maxthon 是一个高度可定制的强大 Web 浏览器. 它基于 Internet Explorer 内核(可能正是您当前使用的默认浏览器), 这意味着它的效果和您在 IE 中看到的效果完全相同, 同时它还给您提供如下的额外功能... 多页面浏览界面、鼠标手势、超级托拽、隐私保护、广告猎手、Google Bar 支持、外部工具栏、自定义皮肤在经过一年多的开发, 在 1.0 版本即将发布之际, MyIE2 最终更名为 Maxthon.这样做的主要原因是我们需要一个更能表现它的强大和不会引起误会的名称(不知道大家还记得 MyIE3 事件没有). 与 MyIE2 一样, Maxthon 也是免费软件, 它继承了 MyIE2 的所有强大功能, 并在易用性和用户亲和力方面着重进行了改善.感谢这些日子的支持. 让我们做得更好!

GreenBrowser 多语言版 3.1.0730GreenBrowser作为一款IE内核多页面浏览器,不断汇集各家长处和经验,并吸取来自用户的反馈,以及自身独到的创新设计,力争实现更实用、更易用、更快捷、更稳定的宗旨。就象名字所言,绿色、免费、免安装。一用上她,无论是从网页的浏览效率、全方位的鼠标操作性、用户定制的多样化、方便细致的搜索栏、自动执行脚本插件等各种特性中,您都能切实的体验到她所带来的网上生活的方便感和贴心感

Mozilla Firefox 1.0.6简体中文版Mozilla Firefox是一个自由的,开放源码的浏览器,适用于 Windows, Linux 和 MacOS X平台,它体积小速度快,还有其它一些高级特征,主要特性有:标签式浏览,使上网冲浪更快;可以禁止弹出式窗口;自定制工具栏;扩展管理;更好的搜索特性;快速而方便的侧栏.这个版本做了脱胎换骨的更新,代码更优秀,功能更强大,包括安装程序,界面和下载管理器都作了改进。精品汉化插件使用方法:点击 '菜单"--"工具"--''扩展'',把.xpi文件拖进弹出窗口里,稍后就可以看到Firefox会询问你是否要安装这个插件,点击是即可,重启浏览器

GoSuRF Browser 2005 2.62.508.6225最IN的多页面浏览器!重现最逼真的IE界面,并提供多项贴心功能: 加强对网页图片、文字的保存,一拖就存。强大的广告过滤,可以阻挡弹出窗口和各种广告条。 超强的网页病毒保护,能防止恶意代码的袭击。稳定的工作,对意外崩溃时进行数据保护。提供方便的在线翻译和浏览代理,冲浪无障碍。 快速准确的分类搜索,轻松获得讯息

E. 屏幕取词

“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在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虚拟内存的管理。Windows9X给每一个进程分配了4GB的地址空间,对于NT来说,这个数字是2GB,系统保留了2GB到 4GB之间的地址空间禁止进程访问,而在Win9X中,2GB到4GB这部分虚拟地址空间实际上是由所有的WIN32进程所共享的,这部分地址空间加载了共享Win32 DLL、内存映射文件和VXD、内存管理器和文件系统码,Win9X中这部分对于每一个进程都是可见的,这也是Win9X操作系统不够健壮的原因。

Win9X中为16位操作系统保留了0到4MB的地址空间,而在4MB到2GB之间也就是Win32进程私有的地址空间,由于 每个进程的地址空间都是相对独立的,也就是说,如果程序想截获其它进程中的API调用,就必须打破进程边界墙,向其它的进程中注入截获API调用的代码,这项工作我们交给钩子函数(SetWindowsHookEx)来完成,关于如何创建一个包含系统钩子的动态链接库,《电脑高手杂志》已经有过专题介绍了,这里就不赘述了。

所有系统钩子的函数必须要在动态库里,这样的话,当进程隐式或显式调用一个动态库里的函数时,系统会把这个动态库映射到这个进程的虚拟地址空间里,这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈,也就是说动态链接库中的代码被钩子函数注入了其它GUI进程的地址空间(非GUI进程,钩子函数就无能为力了),当包含钩子的DLL注入其它进程后,就可以取得映射到这个进程虚拟内存里的各个模块(EXE和DLL)的基地址,如:

HMODULE hmole=GetMoleHandle(“Mypro.exe”);

在MFC程序中,我们可以用AfxGetInstanceHandle()函数来得到模块的基地址。EXE和DLL被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址是在链接时由链接器决定的。当你新建一个Win32工程时,VC++链接器使用缺省的基地址0x00400000。可以通过链接器的BASE选项改变模块的基地址。EXE通常被映射到虚拟内存的0x00400000处,DLL也随之有不同的基地址,通常被映射到不同进程的相同的虚拟地址空间处。

系统将EXE和DLL原封不动映射到虚拟内存空间中,它们在内存中的结构与磁盘上的静态文件结构是一样的。即PE (Portable Executable) 文件格式。我们得到了进程模块的基地址以后,就可以根据PE文件的格式穷举这个模块的IMAGE_IMPORT_DESCRIPTOR数组,看看进程空间中是否引入了我们需要截获的函数所在的动态链接库,比如需要截获“TextOutA”,就必须检查“Gdi32.dll”是否被引入了。

说到这里,我们有必要介绍一下PE文件的格式,如右图,这是PE文件格式的大致框图,最前面是文件头,我们不必理会,从PE File Optional Header后面开始,就是文件中各个段的说明,说明后面才是真正的段数据,而实际上我们关心的只有一个段,那就是“.idata”段,这个段中包含了所有的引入函数信息,还有IAT(Import Address Table)的RVA(Relative Virtual Address)地址。

说到这里,截获WindowsAPI的整个原理就要真相大白了。实际上所有进程对给定的API函数的调用总是通过PE文件的一个地方来转移的,这就是一个该模块(可以是EXE或DLL)的“.idata”段中的IAT输入地址表(Import Address Table)。在那里有所有本模块调用的其它DLL的函数名及地址。对其它DLL的函数调用实际上只是跳转到输入地址表,由输入地址表再跳转到DLL真正的函数入口。

具体来说,我们将通过IMAGE_IMPORT_DESCRIPTOR数组来访问“.idata”段中引入的DLL的信息,然后通过IMAGE_THUNK_DATA数组来针对一个被引入的DLL访问该DLL中被引入的每个函数的信息,找到我们需要截获的函数的跳转地址,然后改成我们自己的函数的地址……具体的做法在后面的关键代码中会有详细的讲解。
讲了这么多原理,现在让我们回到“鼠标屏幕取词”的专题上来。除了API函数的截获,要实现“鼠标屏幕取词”,还需要做一些其它的工作,简单的说来,可以把一个完整的取词过程归纳成以下几个步骤:

1. 安装鼠标钩子,通过钩子函数获得鼠标消息。

使用到的API函数:SetWindowsHookEx

2. 得到鼠标的当前位置,向鼠标下的窗口发重画消息,让它调用系统函数重画窗口。

使用到的API函数:WindowFromPoint,ScreenToClient,InvalidateRect

3. 截获对系统函数的调用,取得参数,也就是我们要取的词。

对于大多数的Windows应用程序来说,如果要取词,我们需要截获的是“Gdi32.dll”中的“TextOutA”函数。

我们先仿照TextOutA函数写一个自己的MyTextOutA函数,如:

BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
// 这里进行输出lpszString的处理
// 然后调用正版的TextOutA函数
}

把这个函数放在安装了钩子的动态连接库中,然后调用我们最后给出的HookImportFunction函数来截获进程对TextOutA函数的调用,跳转到我们的MyTextOutA函数,完成对输出字符串的捕捉。

HookImportFunction的用法:

HOOKFUNCDESC hd;
PROC pOrigFuns;
hd.szFunc="TextOutA";
hd.pProc=(PROC)MyTextOutA;
HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);

下面给出了HookImportFunction的源代码,相信详尽的注释一定不会让您觉得理解截获到底是怎么实现的很难,Ok,Let’s Go:

///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>

// 这里定义了一个产生指针的宏
#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))

// 定义了HOOKFUNCDESC结构,我们用这个结构作为参数传给HookImportFunction函数
typedef struct tag_HOOKFUNCDESC
{
LPCSTR szFunc; // The name of the function to hook.
PROC pProc; // The procere to blast in.
} HOOKFUNCDESC , * LPHOOKFUNCDESC;

// 这个函数监测当前系统是否是WindowNT
BOOL IsNT();

// 这个函数得到hMole -- 即我们需要截获的函数所在的DLL模块的引入描述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hMole, LPCSTR szImportMole);

// 我们的主函数
BOOL HookImportFunction(HMODULE hMole, LPCSTR szImportMole,
LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)
{
/////////////////////// 下面的代码检测参数的有效性 ////////////////////////////
_ASSERT(szImportMole);
_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));
#ifdef _DEBUG
if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));
_ASSERT(paHookFunc.szFunc);
_ASSERT(*paHookFunc.szFunc != '\0');
_ASSERT(!IsBadCodePtr(paHookFunc.pProc));
#endif
if ((szImportMole == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return FALSE;
}
//////////////////////////////////////////////////////////////////////////////

// 监测当前模块是否是在2GB虚拟内存空间之上
// 这部分的地址内存是属于Win32进程共享的
if (!IsNT() && ((DWORD)hMole >= 0x80000000))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);
return FALSE;
}
// 清零
if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC));

// 调用GetNamedImportDescriptor()函数,来得到hMole -- 即我们需要
// 截获的函数所在的DLL模块的引入描述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hMole, szImportMole);
if (pImportDesc == NULL)
return FALSE; // 若为空,则模块未被当前进程所引入

// 从DLL模块中得到原始的THUNK信息,因为pImportDesc->FirstThunk数组中的原始信息已经
// 在应用程序引入该DLL时覆盖上了所有的引入信息,所以我们需要通过取得pImportDesc->OriginalFirstThunk
// 指针来访问引入函数名等信息
PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hMole,
pImportDesc->OriginalFirstThunk);

// 从pImportDesc->FirstThunk得到IMAGE_THUNK_DATA数组的指针,由于这里在DLL被引入时已经填充了
// 所有的引入信息,所以真正的截获实际上正是在这里进行的
PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hMole, pImportDesc->FirstThunk);

// 穷举IMAGE_THUNK_DATA数组,寻找我们需要截获的函数,这是最关键的部分!
while (pOrigThunk->u1.Function)
{
// 只寻找那些按函数名而不是序号引入的函数
if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))
{
// 得到引入函数的函数名
PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hMole,
pOrigThunk->u1.AddressOfData);

// 如果函数名以NULL开始,跳过,继续下一个函数
if ('\0' == pByName->Name[0])
continue;

// bDoHook用来检查是否截获成功
BOOL bDoHook = FALSE;

// 检查是否当前函数是我们需要截获的函数
if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&
(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))
{
// 找到了!
if (paHookFunc.pProc)
bDoHook = TRUE;
}
if (bDoHook)
{
// 我们已经找到了所要截获的函数,那么就开始动手吧
// 首先要做的是改变这一块虚拟内存的内存保护状态,让我们可以自由存取
MEMORY_BASIC_INFORMATION mbi_thunk;
VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
PAGE_READWRITE, &mbi_thunk.Protect));

// 保存我们所要截获的函数的正确跳转地址
if (paOrigFuncs)
paOrigFuncs = (PROC)pRealThunk->u1.Function;

// 将IMAGE_THUNK_DATA数组中的函数跳转地址改写为我们自己的函数地址!
// 以后所有进程对这个系统函数的所有调用都将成为对我们自己编写的函数的调用
pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;

// 操作完毕!将这一块虚拟内存改回原来的保护状态
DWORD dwOldProtect;
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
mbi_thunk.Protect, &dwOldProtect));
SetLastError(ERROR_SUCCESS);
return TRUE;
}
}
// 访问IMAGE_THUNK_DATA数组中的下一个元素
pOrigThunk++;
pRealThunk++;
}
return TRUE;
}

// GetNamedImportDescriptor函数的实现
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hMole, LPCSTR szImportMole)
{
// 检测参数
_ASSERT(szImportMole);
_ASSERT(hMole);
if ((szImportMole == NULL) || (hMole == NULL))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}

// 得到Dos文件头
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hMole;

// 检测是否MZ文件头
if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) ||
(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}

// 取得PE文件头
PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);

// 检测是否PE映像文件
if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
(pNTHeader->Signature != IMAGE_NT_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}

// 检查PE文件的引入段(即 .idata section)
if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
return NULL;

// 得到引入段(即 .idata section)的指针
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,
pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

// 穷举PIMAGE_IMPORT_DESCRIPTOR数组寻找我们需要截获的函数所在的模块
while (pImportDesc->Name)
{
PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
if (stricmp(szCurrMod, szImportMole) == 0)
break; // 找到!中断循环
// 下一个元素
pImportDesc++;
}

// 如果没有找到,说明我们寻找的模块没有被当前的进程所引入!
if (pImportDesc->Name == NULL)
return NULL;

// 返回函数所找到的模块描述符(import descriptor)
return pImportDesc;
}

// IsNT()函数的实现
BOOL IsNT()
{
OSVERSIONINFO stOSVI;
memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));
stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
BOOL bRet = GetVersionEx(&stOSVI);
_ASSERT(TRUE == bRet);
if (FALSE == bRet) return FALSE;
return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);
}
/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////

不知道在之前,有多少朋友尝试过去实现“鼠标屏幕取词”这项充满了挑战的技术,也只有尝试过的朋友才能体会到其间的不易,尤其在探索API函数的截获时,手头的几篇资料没有一篇是涉及到关键代码的,重要的地方都是一笔代过,MSDN更是显得苍白而无力,也不知道除了IMAGE_IMPORT_DESCRIPTOR和IMAGE_THUNK_DATA,微软还隐藏了多少秘密,好在硬着头皮还是把它给攻克了,希望这篇文章对大家能有所帮助。

F. 拜求一个VC++/MFC编写的屏幕取词的程序,就是像金山词霸取词的那种~~用HOOK写的

1.用detour实现hook。非常的简单依样画葫芦就可以劫持本进程的api
http://blog.csdn.net/evi10r/article/details/6659354
2.windows核心编程那本书里有进程注入,你可以下载源码,详见inject和eject的例子,可以把一个dll注入进一个进程

以前做过的,就这样就行。但是现在那个工程没了= =。你hook textout系列函数,然后将消息发回服务器即可,加油。

G. 关于屏幕取词代码问题

屏幕取词的源代码
注意下面的代码在截取多个API的时候会有重入问题,问题在于访问 ShareMem 的时候没有使用
任何互斥进行锁定.
/// 数据定义文件
unit U_Def;
interface
uses
Messages, Windows;
const
WM_MOUSEPT = WM_USER + 1000 + Ord('M') + Ord('P') + Ord('T');
MappingFileName = 'Mapping File By Raphael';
MaxStringLen = 50;
CodeJump = $E9909090;
type
PInt = ^integer;
_ExtTextOutA = function (theDC :HDC; nXStart, nYStart :integer; toOptions

∶ Longint; rect : PRect;
lpStr :PAnsiChar; nCount :integer; Dx : PInteger)
∶BOOL; stdcall;
_PExtTextOutA = ^_ExtTextOutA;
TLongJump = packed record
JmpOp : Cardinal;
Addr : Pointer;
end;
TShareMem = packed record
hProcWnd : HWND; //The main window of the program
hHookWnd : HWND; //The window currently being hooked
hWndPseudo : HWND; //The pseudo window used to repaint the other
window
hProc : THandle; //The process ID of the main program
pMouse : TPoint; //the mouse position
fStrMouseQueue : array [0..MaxStringLen] of Char; //mouse info
nTimePassed : integer; //the time passed since last time's mousemove
bCanSpyNow : Boolean;
bHookExtTextOutA : Boolean;
pOldExtTextOutA : TLongJump;
fStrExtTextOutA : array [0..MaxStringLen] of Char;
end;
PShareMem = ^TShareMem;
implementation
end.
/// HOOK DLL源代码
library dll_HookMouse;
uses
SysUtils,
Windows,
Classes,
Messages,
Math,
Dialogs,
U_Def in 'U_Def.pas';
{$R *.RES}
var
hMouseHook : HHOOK;
SpyInstalled : Boolean;
fTimerID : Cardinal;
pShMem : PShareMem;
hMappingFile : THandle;
function InstallSpy:Boolean; forward;
function UnWiseSpy:Boolean; forward;
function fExtTextOutA(theDC :HDC; nXStart, nYStart :integer; toOptions : Lon
gint; rect : PRect;
lpStr :PAnsiChar; nCount :Longint; Dx: PInteger):BOOL;
stdcall;
var dwBytes, dwCallingProc : DWORD; 答案补充 pOldExtTextOut : _ExtTextOutA;
hMoleGDI : THandle;
poOri, poDC, poText, poMouse : TPoint;
Size : TSize;
begin
UnWiseSpy;
GetWindowThreadProcessID(pShMem^.hHookWnd, @dwCallingProc);
try
if pShMem^.bCanSpyNow and (dwCallingProc <> pShMem^.hProc) then
begin
dwBytes := Min(nCount, MaxStringLen);
CopyMemory(@(pShMem^.fStrExtTextOutA), lpStr, dwBytes);
//Get lpStr Content
//The following codes for get the right text 答案补充 GetDCOrgEx(theDC, poOri);
// 取得本窗口设备相关坐标原点的全局逻辑坐标
poDC.x := nXStart;
poDC.y := nYStart;
//
LPToDP(theDC, poDC, 1);
//全局逻辑坐标转化为设备相关坐标
GetCursorPos(poMouse);
poText.x := poDC.x + poOri.x;
poText.y := poDC.y + poOri.y;
if (GetTextAlign(theDC) and TA_UPDATECP) <> 0 then 答案补充 begin

GetCurrentPositionEx(theDC, @poOri);

poText.x := poText.x + poOri.x;

poText.y := poText.y + poOri.y;
end;
GetTextExtentPoint(theDC, lpStr, nCount, Size);
// 取得要输出的字符串的实际显示大小
if (poMouse.x >= poText.x) and (poMouse.x <= poText.x + Size.cx) and
(poMouse.y >= poText.y) and (poMouse.y <= poText.y + Size.cy) then
begin
pShMem^.bCanSpyNow := False;
pShMem^.nTimePassed := -1;
end; 答案补充 pShMem^.fStrExtTextOutA[dwBytes] := Chr(0);

FlushViewOfFile(pShMem, 0);

if dwCallingProc <> pShMem^.hProc then

PostMessage(pShMem^.hProcWnd, WM_MOUSEPT, 2, 2);

end;

if (dwCallingProc = pShMem^.hProc) or pShMem^.bHookExtTextOutA then

begin

hMoleGDI := GetMoleHandle(PChar('GDI32'));

@pOldExtTextOut := GetProcAddress(hMoleGDI, PChar('ExtTextOutA')); 答案补充 Result := pOldExtTextOut(theDC, nXStart, nYStart, toOptions, rect, lpS

tr, nCount, Dx);

end else

Result := True;

except

Result := False;

end;

SpyInstalled := True;

InstallSpy;

end;

H. 急,求即时预览源码,类似于Google搜索,将鼠标放在上面,右面出现预览页面!

看这个www.yangsh.com 你随便搜索进入页面。然后鼠标落在预览上面。就跟google差不多了。当然要一模一样就修改代码就OK了。 很牛B吧

I. 关于金山词霸对词条的获取方式 它是怎么实现任何一个显示出来的词语都可以捕捉到

词霸有个插件Xdict32.api,在安装的时候会加入到被取词软件目录下,能够截取目标参数信息。
内部编写的源码还得去找找,找到了发消息给你

J. 能不能用C#做屏幕取词有源码吗

可以使用Tesseract-OCR

热点内容
SLSB算法 发布:2024-11-05 01:49:44 浏览:130
比安卓头子短一点的是什么数据线 发布:2024-11-05 01:43:53 浏览:534
c语言多选 发布:2024-11-05 01:41:31 浏览:302
c语言判断一个数是否是素数 发布:2024-11-05 01:36:32 浏览:833
虚拟页式存储 发布:2024-11-05 01:28:01 浏览:214
java比较炫的小程序 发布:2024-11-05 01:27:17 浏览:788
如何在ftp上开放执行权限 发布:2024-11-05 01:22:51 浏览:729
编程半径为5 发布:2024-11-05 01:22:43 浏览:290
linuxnetstatan命令 发布:2024-11-05 00:54:49 浏览:829
红米4a配置如何 发布:2024-11-05 00:53:27 浏览:894