200分继续求[C#屏幕取词]

Neil198 2009-07-29 10:37:57
加精
上个帖子结贴继续求屏幕取词。

以下是找到的一些资料
这是取词的原理
0 判断鼠标是否在一个地方停留了一段时间 
1 取得鼠标当前位置
2 以鼠标位置为中心生成一个矩形
3 挂上API钩子
4 让这个矩形产生重画消息
5 在钩子里等输出字符
6 计算鼠标在哪个单词上面,把这个单词保存下来
7 如果得到单词则摘掉API钩子,在一段时间后,无论是否得到单词都摘掉API钩子
8 用单词查词库,显示解释框。



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

  使用到的API函数:SetWindowsHookEx

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

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

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

这些API在C#中怎么使用?如何安装鼠标钩子,更重要的是如何向鼠标下的窗口发重画消息。

金山词霸的方案基本不可行,因为会涉及到版权问题。除此之外还有调用系统API,或者直接用nhw32.dll这个别人写好的取词DLL。但是没有C#的使用方法。自己试了下,不可以。

nhw32.dll说明

nhw32.dll 主要引出两个函数:

1. DWORD WINAPI BL_SetFlag32(UINT nFlag,
HWND hNotifyWnd,
int MouseX,
int MouseY)
功能:
启动或停止取词。
参数:
nFlag
[输入] 指定下列值之一:
GETWORD_ENABLE: 开始取词。在重画被取单词区域前设置此标志。nhw32.dll是通过
重画单词区域,截取TextOutA, TextOutW, ExtTextOutA,
ExtTextOutW等Windows API函数的参数来取词的。
GETWORD_DISABLE: 停止取词。
hNotifyWnd
[输入] 通知窗口句柄。当取到此时,向该通知窗口发送一登记消息:GWMSG_GETWORDOK。
MouseX
[输入] 指定取词点的X坐标。
MouseY
[输入] 指定取词点的Y坐标。
返回值:
可忽略。
2. DWORD WINAPI BL_GetText32(LPSTR lpszCurWord,
int nBufferSize,
LPRECT lpWordRect)
功能:
从内部缓冲区取出单词文本串。对英语文本,该函数最长取出一行内以空格为界的三个英文单词串,遇空格,非英文字母及除‘-’外的标点符号,则终止取词。对汉字文本,该函数最长取出一行汉字串,遇英语字母,标点符号等非汉语字符,则终止取词。该函数不能同时取出英语和汉语字符。
参数:
lpszCurWord
[输入] 目的缓冲区指针。
nBufferSize
[输入] 目的缓冲区大小。
lpWordRect
[输出] 指向 RECT 结构的指针。该结构定义了被取单词所在矩形区域。
返回值:
当前光标在全部词中的位置。


--我在C#中的引用方法,可能是错误的。
[DllImport(@"C:\Users\xxxx\Documents\Visual Studio 2008\Projects\getWord\getWord\bin\Debug\nhw32.dll")]
private static extern uint BL_SetFlag32(uint nFlag, IntPtr hNotifyWnd, int MouseX, int MouseY);
[DllImport(@"C:\Users\xxxxx\Documents\Visual Studio 2008\Projects\getWord\getWord\bin\Debug\nhw32.dll")]
private static extern uint BL_GetText32([MarshalAs(UnmanagedType.LPStr)]StringBuilder lpszCurWord, int nBufferSize, ref Rectangle lpWordRect);
...全文
1272 75 打赏 收藏 转发到动态 举报
写回复
用AI写文章
75 条回复
切换为时间正序
请发表友善的回复…
发表回复
kings2015 2010-03-30
  • 打赏
  • 举报
回复
高深,先收了
yuji821 2010-03-26
  • 打赏
  • 举报
回复
哈好恶恶的股份 方法
带你一起飞吧 2010-03-17
  • 打赏
  • 举报
回复
太高深
wangshiqi11004 2010-03-11
  • 打赏
  • 举报
回复
C#无法写注入式全局钩子,只此一条就导致你不能用C#写屏幕取词,至于c#调用C++的我有~~
junzi354 2009-10-21
  • 打赏
  • 举报
回复
学习
haa17 2009-10-21
  • 打赏
  • 举报
回复
mark下
soaringbird 2009-08-03
  • 打赏
  • 举报
回复
光凭c#的确是不能实现的
zhouxingyu896 2009-08-03
  • 打赏
  • 举报
回复
学习

学习

查过这方面的信息,自己写还是难得!

支持

Neil198 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 soaringbird 的回复:]
那个书还要不要?
[/Quote]

不要了吧。我彻底放弃了。看来用C#实现是基本不可能的了。
soaringbird 2009-08-03
  • 打赏
  • 举报
回复
那个书还要不要?
SayBoss 2009-07-30
  • 打赏
  • 举报
回复
帮忙顶了
FlyBee 2009-07-30
  • 打赏
  • 举报
回复
学习
opf110 2009-07-30
  • 打赏
  • 举报
回复
mark 下
我很懒 2009-07-30
  • 打赏
  • 举报
回复
顶。。。。
Delta 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 accpyy 的回复:]
关注+学习
[/Quote]来看看啊
loveguaixiaobai 2009-07-30
  • 打赏
  • 举报
回复
太深奥了
Neil198 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 soaringbird 的回复:]
搜了一下,找到了,叫《深入delphi核心编程》
这里有书的源码
http://download.csdn.net/source/149481
[/Quote]
恩,好谢谢,我去看看。。
soaringbird 2009-07-30
  • 打赏
  • 举报
回复
搜了一下,找到了,叫《深入delphi核心编程》
这里有书的源码
http://download.csdn.net/source/149481
soaringbird 2009-07-30
  • 打赏
  • 举报
回复
等周五我回家后吧,手头现在没有,那本书名忘了,好像是叫delphi什么什么内幕,国内几个人编写的,都是一些底层的操作,是01还是02年出版的。
Neil198 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 soaringbird 的回复:]
那本书上有例子,用Delpphi1.0编译一下,就可以用了。
如果需要,等我周末回家可以给你。
[/Quote]
给我一份资料吧,谢谢啦。。邮箱sl_wxy@msn.cn

目前已经实现了全局钩子,屏幕区域重画,但是不知道在哪里截获TextOut
加载更多回复(51)

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧