1. 缘起

要搞一个作弊软件,需要把屏幕上的试题取下来。

据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件。

发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一个就是上面的GetWord。

1.1 金山词霸 XdictGrb.dll

这里有C#的例子

C# 的例子似乎不太稳定,取几个词之后就取不到了,不知道卡在哪里了。

而且 C# 转换为 Python 也遇到了困难,主要是不太熟悉COM和Python的相互调用,留着以后解决。

1.2 GetWord 3.3

GetWord 3.3,自带VB\VC\C#\Delphi的例子。

大概看了下原理:首先需要自己创建一个窗体。每当控件取词成功之后就会向这个窗口发送一个消息作为通知。窗体接受到消息之后可以做进一步的处理。

1.3 GetWord 官方版

这里是官网 http://www.textcapture.com/

官网版本比较高,接口变化挺大的,似乎调用起来比以前方便,不用像 3.3 那样非要自己实现一个窗口来接受消息,直接注册一个回调函数就可以了。可惜的是没有找到官方的例子,按照帮助文档试了试,没成功,也就放弃了。反正3.3也好用。

2. Python + GetWord 3.3

GetWord 3.3 有两种调用方式,一种是作为ActiveX控件,一种是直接调用DLL内的函数。还是DLL的方法比较简单。

下面的代码是从 C# 转过来的,由于没有文档,有些函数也不明白是什么意思,不过照猫画虎的能用。

  1. import win32con,win32gui,win32api
  2. import ctypes
  3. class MyWindow():
  4. def __init__(self):
  5. self.getword_loaded = False
  6. #注册一个窗口类
  7. wc = win32gui.WNDCLASS()
  8. wc.lpszClassName = 'MyWindow'
  9. wc.hbrBackground = win32con.COLOR_BTNFACE+1
  10. wc.lpfnWndProc = self.wndProc
  11. class_atom=win32gui.RegisterClass(wc)
  12. #创建窗口
  13. self.hwnd = win32gui.CreateWindow(
  14. class_atom, u'窗口标题', win32con.WS_OVERLAPPEDWINDOW,
  15. win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
  16. 200, 100,
  17. 0,0, 0, None)
  18. #显示窗口
  19. win32gui.ShowWindow(self.hwnd, win32con.SW_SHOWNORMAL)
  20. self._init_getword()
  21. def _init_getword(self):
  22. LICENSEID = "{00000000-0000-0000-0000-000000000000}"
  23. MOUSEHOOK_CAPTURE_OK_MSG = "MOUSEHOOK_CAPTUREOK_MSG-" + LICENSEID
  24. self.MOUSEHOOK_CAPTURE_OK = win32gui.RegisterWindowMessage(MOUSEHOOK_CAPTURE_OK_MSG)
  25. self.icall = ctypes.windll.LoadLibrary('ICall')
  26. self.icall.SetMouseHook(self.hwnd)
  27. self.icall.MouseEnableCap(True)
  28. self.icall.GetWordEnableCap(True)
  29. self.getword_loaded = True
  30. def _del_getword(self):
  31. self.getword_loaded = False
  32. self.icall.RemoveMouseHook()
  33. hdll = win32api.GetModuleHandle('ICall.dll')
  34. win32api.FreeLibrary(hdll)
  35. def _capture_text(self):
  36. MAX_OUTPUT_LEN = 1024
  37. x,y = win32gui.GetCursorPos()
  38. hrwnd = self.icall.GetRealWindow(x, y)
  39. strtmp = ctypes.create_unicode_buffer('\0' * MAX_OUTPUT_LEN)
  40. i=ctypes.c_int(-1)
  41. ok = self.icall.GetWord(hrwnd, x, y, strtmp, MAX_OUTPUT_LEN, ctypes.byref(i))
  42. if ok:
  43. print u'全部文本:%s' % strtmp.value
  44. print u'单词位置:%s' % i.value
  45. #消息处理
  46. def wndProc(self, hwnd, msg, wParam, lParam):
  47. if self.getword_loaded and msg == self.MOUSEHOOK_CAPTURE_OK:
  48. print 'MOUSEHOOK_CAPTURE_OK'
  49. self._capture_text()
  50. if msg == win32con.WM_CLOSE:
  51. print 'WM_CLOSE'
  52. self._del_getword()
  53. if msg == win32con.WM_DESTROY:
  54. print 'WM_DESTROY'
  55. win32gui.PostQuitMessage(0)
  56. return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
  57. mw = MyWindow()
  58. win32gui.PumpMessages()

3. 其实也不用那么麻烦

如果只是用来捕获屏幕上某点的文本,而忽略其提供的一套鼠标和键盘响应机制,那么就十分简单了。

下面的代码单独封装了取词功能。

  1. from ctypes import *
  2. from ctypes import wintypes
  3. class GetWord():
  4. '''封装 GetWord 3.3 的取词功能'''
  5. def __init__(self):
  6. self.icall = windll.LoadLibrary('ICall.dll')
  7. self.icall.GetWordEnableCap(True)
  8. def __del__(self):
  9. hdll = windll.Kernel32.GetModuleHandleA('ICall.dll')
  10. windll.Kernel32.FreeLibrary(hdll)
  11. def getText(self,x,y):
  12. '''屏幕取词,返回坐标所指的一行文字,以及所指字符在行中的索引'''
  13. MAX_OUTPUT_LEN = 1024
  14. hrwnd = self.icall.GetRealWindow(x, y)
  15. strtmp = create_unicode_buffer('\0' * MAX_OUTPUT_LEN)
  16. i = c_int(-1)
  17. ok = self.icall.GetWord(hrwnd, x, y, strtmp, MAX_OUTPUT_LEN, byref(i))
  18. if ok:
  19. return strtmp.value, i.value

鼠标和键盘的响应机制包括判断鼠标悬停、快捷键等功能。下面用 pyHook 勉强模仿一下,粗糙简陋,仅仅作为取词演示。

  1. from pyHook import HookManager
  2. from pythoncom import PumpMessages
  3. _gw = GetWord()
  4. def onKeyDown(event):
  5. if event.IsAlt(): #当按下Alt键的时候,进行鼠标取词,并打印出来。
  6. global _gw
  7. point = wintypes.POINT()
  8. windll.User32.GetCursorPos(byref(point))
  9. r = _gw.getText(point.x, point.y)
  10. if r:
  11. print u'整行文本:%s' % r[0]
  12. print u'字符位置:%s' % r[1]
  13. return True
  14. if __name__ == "__main__":
  15. hm = HookManager()
  16. hm.KeyDown = onKeyDown
  17. hm.HookKeyboard()
  18. PumpMessages()

GetWord 3.3 屏幕取词的更多相关文章

  1. 基于C#利用金山取词组件实现屏幕取词功能

    这个程序在网上有很多例子,近期要做的项目中有和这个有某些一点点相似的地方,就练练,发现在本机上(Win 7 64位)不能实现其功能,可能原因是API组件太老了吧,毕竟金山大佬公布他的组件是2005年, ...

  2. delphi中使用词霸2005的动态库XdictGrb.dll实现屏幕取词

    近日来,在网上发现关于屏幕取词技术的捷径,搜索很长时间,发现实现方式以VB出现的居多,但是通过Delphi来实现的却好象没有看到,自己参考着VB的相关代码琢磨了一下通过delphi来实现的方式. 其实 ...

  3. [代码]--c#实现屏幕取词源码下载

    最近公司有一个 项目需要实现类似于金山词霸,有道词典等的屏幕取词功能,准确来说是划词功能,网上搜了各种屏幕取词无外乎就两种: A.金山词霸组件法 B.Nhw32.dll法 百度搜到的重复内容真的太多了 ...

  4. mac 10.9开启有道词典取词功能

    取词时候,有道词典给出提示,说要去开启辅助功能,但提示的是在mac 10.8上面怎么操作,在10.9的话,就是以下位置去改了. 补充以下: 在mac机器上,实际上大多数的单词都能从自带的词典中查找到. ...

  5. 有道词典for mac不能取词解决方案

    在mac上装了有道词典,发现在Chrome上不能取词,网上也没有搜到合适的解决方案,后来发现解决这个问题很简单,打开有道词典,点击设置, 再点击软件更新,就会发现有chrome取词插件,安装就OK了. ...

  6. 2013-2-1 pdf中无法用金山词霸取词问题

    打开pdf的编辑——〉首选项——〉一般——〉选项——〉开始——〉只有经过认证的插件,把‘checkbox’里的勾去掉,重启. ★在acrobat reader启动画面里如果没有加载xdict32(工具 ...

  7. document.selection window.getSelection()

    IE9以下支持:document.selection  IE9.Firefox.Safari.Chrome和Opera支持:window.getSelection() 屏幕取词 function ge ...

  8. Mac 词典工具推荐:Youdao Alfred Workflow(可同步单词本)

    想必大家都有用过 Mac 下常见的几款词典工具: 特性 系统 Dictionary 欧路词典 Mac 版 有道词典 Mac 版 在线搜索 ✗ ✔ ✔ 屏幕取词 ☆☆☆ ★★☆ ★☆☆ 划词搜索 ★★★ ...

  9. Linux学习内容

    Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...

随机推荐

  1. Java程序设计之算出一年第多少天

    可以直接拷贝运行. package year; import java.util.Scanner; public class year { public static void main(String ...

  2. 简单轮播js实现

    <!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" ...

  3. [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵

    An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...

  4. [LeetCode] Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  5. [LeetCode] Combine Two Tables 联合两表

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  6. [LeetCode] Remove Duplicates from Sorted List 移除有序链表中的重复项

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  7. 高品质开源工具Chloe.ORM:支持存储过程与Oracle

    扯淡 这是一款高质量的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq.借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询.聚合查询.插入数据.批量删 ...

  8. IT培训行业揭秘(一)

    最近一个多月来,身边有很多朋友问我,我家孩子明年就要大学毕业了,现在工作还没有着落,最近孩子回家经常和我说,他们学校最近来了很多IT培训班,让同学们参加培训,然后各个培训班动辄拿出往届他们的培训学生赚 ...

  9. 分享一些自己的学习过程和学习方法(来自daimajia)

    每天,都会有人在微博上私信我,问我关于学习和成长的问题.这种问题我一般都不会回复某个j,毕竟每个人的情况不一样,每个人对待事物的性格也不一样,我不能夸下海口的说,你看某本书几个月就能如何如何,我能做的 ...

  10. MVC其实很简单(Django框架)

    Django框架MVC其实很简单 让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同. 下面就是通过使用Django来完成以上功能的例子: 首先,我们 ...