1. 缘起

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

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

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

1.1 金山词霸 XdictGrb.dll

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

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

1.2 GetWord 3.3

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

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

1.3 GetWord 官方版

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

2. Python + GetWord 3.3

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

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

import win32con,win32gui,win32api

import ctypes

class MyWindow():

def __init__(self):

self.getword_loaded = False

#注册一个窗口类

wc = win32gui.WNDCLASS()

wc.lpszClassName = 'MyWindow'

wc.hbrBackground = win32con.COLOR_BTNFACE+1

wc.lpfnWndProc = self.wndProc

class_atom=win32gui.RegisterClass(wc)

#创建窗口

self.hwnd = win32gui.CreateWindow(

class_atom, u'窗口标题', win32con.WS_OVERLAPPEDWINDOW,

win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,

200, 100,

0,0, 0, None)

#显示窗口

win32gui.ShowWindow(self.hwnd, win32con.SW_SHOWNORMAL)

self._init_getword()

def _init_getword(self):

LICENSEID = "{00000000-0000-0000-0000-000000000000}"

MOUSEHOOK_CAPTURE_OK_MSG = "MOUSEHOOK_CAPTUREOK_MSG-" + LICENSEID

self.MOUSEHOOK_CAPTURE_OK = win32gui.RegisterWindowMessage(MOUSEHOOK_CAPTURE_OK_MSG)

self.icall = ctypes.windll.LoadLibrary('ICall')

self.icall.SetMouseHook(self.hwnd)

self.icall.MouseEnableCap(True)

self.icall.GetWordEnableCap(True)

self.getword_loaded = True

def _del_getword(self):

self.getword_loaded = False

self.icall.RemoveMouseHook()

hdll = win32api.GetModuleHandle('ICall.dll')

win32api.FreeLibrary(hdll)

def _capture_text(self):

MAX_OUTPUT_LEN = 1024

x,y = win32gui.GetCursorPos()

hrwnd = self.icall.GetRealWindow(x, y)

strtmp = ctypes.create_unicode_buffer('\0' * MAX_OUTPUT_LEN)

i=ctypes.c_int(-1)

ok = self.icall.GetWord(hrwnd, x, y, strtmp, MAX_OUTPUT_LEN, ctypes.byref(i))

if ok:

print u'全部文本:%s' % strtmp.value

print u'单词位置:%s' % i.value

#消息处理

def wndProc(self, hwnd, msg, wParam, lParam):

if self.getword_loaded and msg == self.MOUSEHOOK_CAPTURE_OK:

print 'MOUSEHOOK_CAPTURE_OK'

self._capture_text()

if msg == win32con.WM_CLOSE:

print 'WM_CLOSE'

self._del_getword()

if msg == win32con.WM_DESTROY:

print 'WM_DESTROY'

win32gui.PostQuitMessage(0)

return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)

mw = MyWindow()

win32gui.PumpMessages()

3. 其实也不用那么麻烦

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

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

from ctypes import *

from ctypes import wintypes

class GetWord():

'''封装 GetWord 3.3 的取词功能'''

def __init__(self):

self.icall = windll.LoadLibrary('ICall.dll')

self.icall.GetWordEnableCap(True)

def __del__(self):

hdll = windll.Kernel32.GetModuleHandleA('ICall.dll')

windll.Kernel32.FreeLibrary(hdll)

def getText(self,x,y):

'''屏幕取词,返回坐标所指的一行文字,以及所指字符在行中的索引'''

MAX_OUTPUT_LEN = 1024

hrwnd = self.icall.GetRealWindow(x, y)

strtmp = create_unicode_buffer('\0' * MAX_OUTPUT_LEN)

i = c_int(-1)

ok = self.icall.GetWord(hrwnd, x, y, strtmp, MAX_OUTPUT_LEN, byref(i))

if ok:

return strtmp.value, i.value

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

from pyHook import HookManager

from pythoncom import PumpMessages

_gw = GetWord()

def onKeyDown(event):

if event.IsAlt(): #当按下Alt键的时候,进行鼠标取词,并打印出来。

global _gw

point = wintypes.POINT()

windll.User32.GetCursorPos(byref(point))

r = _gw.getText(point.x, point.y)

if r:

print u'整行文本:%s' % r[0]

print u'字符位置:%s' % r[1]

return True

if __name__ == "__main__":

hm = HookManager()

hm.KeyDown = onKeyDown

hm.HookKeyboard()

PumpMessages()

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

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

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

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

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

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

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

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

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

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

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

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

document.selection window.getSelection()

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

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

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

Linux学习内容

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

随机推荐

用js实现动画效果核心方式

为了做好导航菜单,有时候需要在菜单下拉的时候实现动画效果,所以这几天就研究了研究如何用js实现动画效果,实现动画核心要用到两个函数,一个是setTimeOut,另一个是setInterval. 下边我 ...

(Xaml) Type 'DeviceA' is not defined.

修改了一些Xaml, 始终提示 Compiler error(s) encountered processing expression "deviceA.B".Type 'Devi ...

普通用户安装 R 包

转自 http://bnuzhutao.cn/archives/901 一般 R 语言的书籍上,介绍安装 R 包的方法都是这样的: install.packages("packagename ...

JAVA 调用matlab 出错总结

1.Java:Unsupported major.minor version 51.0 (unable to load class 出现该错误是由于class编译器的JDK版本高于运行期的JDK版本. ...

unigui TUniTreeView demo

unit untTree; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

日志logger

1.使用指定类初始化日志对象 在日志输出的时候,可以打印出日志信息所在类如:Logger logger = LoggerFactory.getLogger(com.Book.class);       ...

HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 树链剖分的模版,成段更新单点查询.熟悉线段树的成段更新的话就小case啦. //树链剖分 边权修 ...

抓取天涯文章的蜘蛛代码,刚经过更新(因为天涯页面HTML代码变化)

#_*_coding:utf-8-*- import urllib2 import traceback import codecs from BeautifulSoup import Beautifu ...

最强大的跨语言调用生成工具:Swig 快速实用教程

swig是一个生成其他高级语言调用c和C++代码的工具,比如,大家都知道java的jni,可能没写过,因为非常麻烦,swig可以帮助生成这样的代码,编译生成的代码后,它会生成java类和c代码文件.分 ...

检测三种不同操作系统的Bash脚本

检测三种不同操作系统(GNU/Linux, Mac OS X, Windows NT)的Bash脚本. 设计: 1.使用“uname”命令获取系统信息,带上“-s”参数个打印内核名称. 2.使用“ex ...

python屏幕取词_GetWord 3.3 屏幕取词相关推荐

  1. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  2. python爬取网易云音乐生成王力宏歌曲词云

    python爬取网易云音乐生成王力宏歌曲词云 # -*- coding:utf-8 -*- # 网易云音乐,通过歌手id生成词云 import requests import sys,re,os fr ...

  3. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  4. Python爬取网易云歌曲评论,做词云分析

    前言 emmmm 没什么说的,想说的都在代码里 环境使用 Python 3.8 解释器 3.10 Pycharm 2021.2 专业版 selenium 3.141.0 本次要用到selenium模块 ...

  5. 使用python抓取微信好友个性签名并形成词云(itchat;wordcloud)

    我主要参考这篇文章进行实践:点击打开链接 python版本:3.5 首先整体步骤分为两步:第一步,抓取好友个性签名,这一步主要依靠itchat实现:第二步,分词并形成词云,主要依靠jieba和word ...

  6. 基于python的自媒体和官媒数据爬取、对比可视化分析及云词图提取关键词

    创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~ 1. 问题描述 为了研究自媒体和官媒的传播新闻<武汉快递小哥汪勇的先进事迹>的及时性和传播力度,对比两种传播途 ...

  7. Python 技术篇-使用PyQt5库获取电脑屏幕桌面的宽、高和分辨率

    有时我们需要根据电脑的分辨率来调整我们的工具窗口.这时就需要获取电脑的分辨率,获取方法如下: 先通过 QApplication.desktop() 获取一个桌面的对象. 然后通过它的 width() ...

  8. Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

    Scrapy是一个用于爬行网站以及在数据挖掘.信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业. 在本文中我们将建立一个从Hacker News爬取数据的爬虫,并将数据按我 ...

  9. Python网络爬虫,pyautogui与pytesseract抓取新浪微博数据,OCR

    Python网络爬虫,pyautogui与pytesseract抓取新浪微博数据,OCR方案 用ocr与pyautogui,以及webbrowser实现功能:设计爬虫抓取新浪微博数据,比如,抓取微博用 ...

最新文章

  1. 为了面试,从头到尾说一次 Java 垃圾回收
  2. 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...
  3. 组合数(Combinatorial_Number)
  4. ITK:创建文件名列表
  5. css禁用选中文本_使用CSS禁用文本选择突出显示
  6. Unity 游戏框架搭建 (五) 简易消息机制
  7. PHP 文件下载 header设置
  8. PHP住院收费系统管理,住院收费管理系统
  9. Bolt界面引擎中XLUE布局XML文件节点属性配置详解
  10. 细说 AppCompat 主题引发的坑:You need to use a Theme.AppCompat theme with this activity!
  11. 错误号 MSSQL_REPL20011 错误号:15517
  12. 一次性搞懂css中的clamp函数,max函数,min函数,vmax,vmin
  13. 下载软件一直转圈圈_苹果手机下载不了app,一直转圈怎么办?(附两种解决方法)...
  14. Nginx中root与alias区别
  15. 现在开一间网吧还能挣钱么?
  16. 《iOS Drawing Practical UIKit Solutions》读书笔记(三) —— Drawing Images
  17. 博士第六年还没有发Paper是一种什么样的体验?
  18. 如何识别骗子广告联盟,骗子广告联盟常用手段
  19. Android开发浅谈:关于如何把手机壳颜色设置为我们App的主题颜色
  20. 百度云心里的声音加长版

热门文章

  1. C#与matlab混合编程,MATLAB生成dll出现的问题,请大家一起研究一下,谢谢
  2. 配置数据库ODBC数据源
  3. java知识竞赛题库_Java练习题库(含答案及解析)100题
  4. PHP基于thinkphp的网上图书管理系统
  5. FFMPEG实现对AAC解码(采用封装格式实现)
  6. 递归 汉诺塔 C语言
  7. java发送邮件附件乱码
  8. uni-app 介绍及使用
  9. Delphi 2010 调用WebService接口
  10. 20万套机械、模具、数控、工艺夹具、减速器、机器人、液压系统、车辆工程、PLC 、单片机……毕业设计、课程设计、说明书 论文、二维图、三维图、开题报告、任务书、ppt、文献翻译……分享……持续更新!