delphi中使用词霸2005的动态库XdictGrb.dll实现屏幕取词
近日来,在网上发现关于屏幕取词技术的捷径,搜索很长时间,发现实现方式以VB出现的居多,但是通过Delphi来实现的却好象没有看到,自己参考着VB的相关代码琢磨了一下通过delphi来实现的方式。
其实也差不多,唯一不同的只有一个地方就是取词对象GrabProxy的AdviseGrab这个方法,该方法的参数是一个IXDictGrabSink 的接口类型,在Vb中是AdviseGrab(Me)就可以了,但是在delphi中 则不能简单使用AdviseGrab(self)来,在前面 TForm1 = class(TForm)的这个Form类声明必须在继承一个接口才行,所以应该改成 TForm1 = class(TForm,IXDictGrabSink),然后实现IxDictGrabSink接口的方法QueryWord,该方法就是用来取词的。
function QueryWord(const WordString: WideString; lCursorX: Integer; lCursorY: Integer;
const SentenceString: WideString; var lLoc: Integer; var lStart: Integer): Integer;safecall;
此时你就可以通过类似于Vb中来进行指定了,AdviseGrab(self)就将接口指向了他自己。
但此之前,你必须先得到XDICTGRB_TLB单元,你可以通过delphi的
Project---->Import Type Library..来把该动态库引用进来,然后创建单元,或是简单的,你直接把他创建成一可用的控件。
然后在窗体中调用。
当成控件来使用如下:
直接拖到窗体上,然后将窗体代码中的TForm1 = class(TForm)改成
TForm1 = class(TForm,IXDictGrabSink),并且实现IXDictGrabSink接口中的方法的声明
function QueryWord(const WordString: WideString; lCursorX: Integer; lCursorY: Integer;
const SentenceString: WideString; var lLoc: Integer; var lStart: Integer): Integer;safecall;
然后在指定他的属性
GrabProxy1.GrabInterval := 1;//指定抓取时间间隔
self.GrabProxy1.GrabMode := XDictGrabMouse;//模式(鼠标是否加按键)
self.GrabProxy1.GrabEnabled := true;//是否有效
self.GrabProxy1.AdviseGrab(self);//接口指向自身
然后就是屏幕取词方法的实现
function TForm1.QueryWord(const WordString: WideString; lCursorX,
lCursorY: Integer; const SentenceString: WideString; var lLoc,
lStart: Integer): Integer;
begin
//Label1是当前鼠标的位置,Lcursorx,LCursorY表示鼠标的位置
Label1.Caption := '(' + inttostr(lCursorX) + ',' +inttostr(lCursorY) + ')';
//Label2是当前鼠标指向的位置的字符串,保留在(SentenceString)中
Label2.Caption := '当前语句:' + SentenceString ;
//Lloc鼠标在语句中的位置 ,label3得到当前字符串
Label3.Caption := '当前字符:' + Midstr(SentenceString,lloc+1,1);
end;
方法二:不使用控件,通过使用createOleObject(str)函数来实现动态创建该取词对象
同样引用OleServer, XDICTGRB_TLB两个单元,然后
TForm1 = class(TForm)改成
TForm1 = class(TForm,IXDictGrabSink),并且实现IXDictGrabSink接口中的方法的声明
之后声明变量Gp: variant;
在窗体的Show中写代码如下:
procedure TForm1.FormShow(Sender: TObject);
var
i: IXDictGrabSink;
begin
//声明一个接口变量,然后把自己赋给该变量以便后面的方法调用接口
i := self;
//创建对象
gp := CreateOleObject('XdictGrb.GrabProxy');
//指定属性
gp.GrabEnabled := true;
gp.GrabInterval := 1;
gp.GrabMode := XDictGrabMouse;
gp.AdviseGrab(i);
end;
然后实现接口的取词方法。
注意:在窗体的Close事件中要写上 gp := 0;将创建的取词对象释放掉,否则窗体关闭的时候会出错哦!
http://blog.csdn.net/genispan/article/details/3981159
delphi中使用词霸2005的动态库XdictGrb.dll实现屏幕取词的更多相关文章
- GetWord 3.3 屏幕取词
1. 缘起 要搞一个作弊软件,需要把屏幕上的试题取下来. 据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件. 发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一 ...
- 基于C#利用金山取词组件实现屏幕取词功能
这个程序在网上有很多例子,近期要做的项目中有和这个有某些一点点相似的地方,就练练,发现在本机上(Win 7 64位)不能实现其功能,可能原因是API组件太老了吧,毕竟金山大佬公布他的组件是2005年, ...
- C#调用SCL2008 动态库SCL_API_cdecl.dll or SCL_API_Stdcall.dll,提示找不到指定模块
在公司用的联想 ThinkPad T430i,原装配置及系统,开机巨慢.按下开机键到登陆界面超过1分钟,再到桌面这个时间就难说了,多时有超过3分钟,进入桌面还要等待几分钟才能正常操作.新年过来向公司领 ...
- cmake中设置ELF文件加载动态库的位置
1. 三个文件 1. world.c #include<stdio.h> void world(void) { printf("world.\n"); } 2. hel ...
- C#调用C++动态库(dll)
在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...
- 驱动里执行应用层代码之KeUserModeCallBack(WOW64是由三个动态库wow64.dll wow64win.dll wow64cpu.dll来实现)
在驱动层(ring0)里执行应用层(ring3)代码,这是个老生常谈的技术,而且方法也挺多. 这种技术的本质:其实就是想方设法在驱动层里把应用层代码弄到应用层去执行. 比如在APC异步调用中,KeIn ...
- [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接
转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...
- 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见
静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...
- C++编写动态库(.DLL)给C#调用方法
1.在头文件中按照如下格式编写函数申明 extern "C" __declspec(dllexport) double __stdcall Add(double a, double ...
随机推荐
- Android MagicIndicator系列之一 —— 使用MagicIndicator打造千变万化的ViewPager指示器
说到 ViewPager 指示器,想必大家都不陌生,绝大部分应用中都有这个.使用频率非常之高.但系统对它的支持并不好,自带的 PagerTabStrip 和 PagerTitleStrip 太弱,很难 ...
- JavaEE分层知识点粗略解释
JavaEE知识点总结 什么是分层开发? 一种化大为小,分而治之的软件开发方法. 分层的特点: 1.每一层都有自己的责任. 2.上一层不用关心下一层的实现细节,上一层通过下一层 提供的对外接口来使用其 ...
- Hadoop源码分析(MapReduce概论)
大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花非常多的时间去介绍HDFS的背景.毕竟大家对文件系统的还是有一定的理解的,并且也有非常好的文档.在分析Hadoop的MapReduce部分前,我 ...
- Android JNI -基础篇
JNI(Java Native Interface,JAVA本地接口) 可以使Java代码和其他语言写的代码(如C/C++代码)进行交互.为什么要进行交互? 首先,Java语言提供的类库无法满足要求, ...
- pytharm运行django项目
pytharm运行django项目 安装Django 下载Django包,解压缩. CMD 进入解压路径下. 执行: python setup.py install 增加环境变量: C:\Pytho ...
- JavaScript学习笔记八
本文依据慕课网课程<JavaScript进阶>学习整理 第8章 浏览器对象 8-1 window对象 window对象是BOM的核心.window对象指当前的浏览器窗体. wind ...
- gcc新版本号引起的编译错误(命令运行时的外部库输入位置)
昨天,遇到一个比較bug的错误,用gcc来编译几个简单的文件出错,编译环境为x86_64的Ubuntu12.04.gcc版本号号例如以下: gcc (Ubuntu/Linaro 4.6.3-1ubun ...
- github上最全的资源教程-前端涉及的所有知识体系【转】
github上最全的资源教程-前端涉及的所有知识体系[转自:蓝猫的博客] 综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.h ...
- 一起学Python:字符串介绍
字符串介绍 <1>python中字符串的格式 如下定义的变量a,存储的是数字类型的值 a = 100 如下定义的变量b,存储的是字符串类型的值 b = "hello itcast ...
- TensorFlow 实战(二)—— tf.train(优化算法)
Training | TensorFlow tf 下以大写字母开头的含义为名词的一般表示一个类(class) 1. 优化器(optimizer) 优化器的基类(Optimizer base class ...