leoking71 发表于 2012-7-5 10:15:27

屏幕取词的一些研究与探讨(已解决)

本帖最后由 leoking71 于 2012-7-8 09:27 编辑

关于屏幕文本捕捉,Autoit已有一种方法,参见 ghl781258同学的帖子"屏幕文字捕获:Aqua Deskperience V1.3.11"。
这种方法中,Aqua提供了一种交互式的屏幕取词方法,即脚本运行到屏幕取词这步时,可以停下来等我们在屏幕上用鼠标刷出一个矩形区后再继续运行下去。这个方法叫CaptureInteractive方法。
我参考了http://msgboard.alphasoftware.com/alphaforum/showthread.php?78107-com-object(只需看11楼Rabins写出的可以运行的脚本代码即可),写下这段Autoit代码:

Dim $hWnd=0,$left=0,$top=0,$width=0,$height=0
$oTcapt = ObjCreate("TCaptureX.TextCaptureX")
$capt=$oTcapt.CaptureInteractive($hWnd,$left,$top,$width,$height)
MsgBox(0,"$capt=",$capt)

一切都如期发生了,信息窗口显示“$capt=0”,这说明选择是成功的(根据Aqua帮助说明:若$capt这个值为1说明用户取消了选择,若为2说明有出错)

现在的问题是如何把已经刷屏取到的文本或数字信息给显示出来??
外国朋友Rabins的脚本中,我们可以看到,他是用一个“showvar()”函数来达成的。我们在Autoit中如何达成呢??

user3000 发表于 2012-7-5 11:19:36

回复 1# leoking71

我看了那个 11楼Rabins写出的代码, 发现用此句输出:
showvar(tc.GetTextFromRect(HWnd, Left, Top, Width, Height), “Capture Interactive”)

那么, 在AU3中应该用如下语句输出取词的结果:If $capt = 0 Then MsgBox(0,"取词结果",$oTcapt.GetTextFromRect($HWnd, $Left, $Top, $Width, $Height))楼主把注意力放在“showvar()”函数上面, 太不应该了.

leoking71 发表于 2012-7-5 11:52:17

谢谢User3000的提醒,应该是个正确的理解与语句。
但是,我加上这句语句后,程序运行时跳出报错窗口如图
搞不清楚问题出在哪了。。。(也检查了那个$capt的值,在执行到最后一句语句时确实是=0状态)

leoking71 发表于 2012-7-5 12:05:40

我尝试用如下代码运行(加了一句用以检查变量的值是否有变化)

Dim $hWnd=0,$left=0,$top=0,$width=0,$height=0
$oTcapt = ObjCreate("TCaptureX.TextCaptureX")
$capt=$oTcapt.CaptureInteractive($hWnd,$left,$top,$width,$height)
MsgBox(0,"$capt=",$capt)
MsgBox(0,"变量检查","$hWnd="&$hWnd&@CRLF&"$left="&$left&@CRLF&"$top="&$top&@CRLF&"$width="&$width&@CRLF&"$height="&$height)
If $capt = 0 Then MsgBox(0,"取词结果",$oTcapt.GetTextFromRect($HWnd, $Left, $Top, $Width, $Height))

发现,原来$hWnd,$left,$top,$width,$height这四个变量的值到出错钱都一直保持为0!难道这是问题的症结。。。迷惑。。{:face (382):}

afan 发表于 2012-7-5 12:21:12

CaptureInteractive 如何返回矩形坐标确实不解,共同关注下~

user3000 发表于 2012-7-5 13:52:51

本帖最后由 user3000 于 2012-7-5 23:57 编辑

回复 4# leoking71
此楼发言有误, 已重新编辑.

调用 CaptureInteractive 方法时, 需要预先创建5个参数, 将会是手动地用鼠标在取词窗口上框选取词范围(矩阵:x轴坐标, y轴坐标, 宽度, 高度),
自动将窗口句柄, 及矩阵坐标等值存入这5个参数中(以指针方式返回). 再调用GetTextFromRect来获取所取的词.

详见 下页中的第16楼.

netegg 发表于 2012-7-5 14:08:58

回复 1# leoking71
很明显$hWnd,$left,$top,$width,$height这五个变量始终保持0,对要获取的操作区相当于没取,再分析下对象如何确定5个要素的值,应该可以整出来

ooxxgod 发表于 2012-7-5 14:21:18

屏幕找词 还是色?

leoking71 发表于 2012-7-5 14:50:32

我有点怀疑可能问题出在那个TcaptureX.dll文件身上。我们这里获取这个文件大多是从各个下载网站得到的,而这款国外软件并非是免费的,所以我们手里的这个库文件与正版的那个库文件可能有点差别的。
而Rabins所用的也许是个正版的,他就成功地解决了问题。。。
刚才我在网上重新下载了个Aqua,来自http://dl.pconline.com.cn,版本为1.3.0.14,下载后进行安装(这样省去手工注册了)
然后打开一个Word文档,上面随便黏贴一些文字内容上去,再编了下面一个脚本:

$oTcapt = ObjCreate("TCaptureX.TextCaptureX")
$hd = Dec(StringTrimLeft(WinGetHandle("文档"), 2))
WinActivate("文档")
$capt=$oTcapt.GetTextFromRect($hd, 500, 200, 500, 200)
MsgBox(0,"$capt=",$capt)

结果表明,屏幕取词很成功。说明这个版本的Aqua对于使用GetTextFromRect方法进行屏幕取词是有效的。
使用CaptureInteractive方法进行屏幕取词的有效性尚需验证。

leoking71 发表于 2012-7-5 15:00:19

CaptureInteractive 如何返回矩形坐标确实不解,共同关注下~
afan 发表于 2012-7-5 12:21 http://www.autoitx.com/images/common/back.gif

Afan达人,能否关注下我这个帖子上的问题:
http://www.autoitx.com/thread-33213-1-1.html
这个问题与屏幕取词有点关联性。。。我发现,似乎在用GetTextFromRect方法进行屏幕取词的时候,我们必须先要激活文字所在的那个窗口并且取得这个特定窗口的句柄,方能用此法进行屏幕取词。
那么当一个标题被若干个窗口同名共享的时候(也就对应了若干个窗口句柄),难免Aqua也就迷糊了,取不到词也似乎在清理之中了。。。这只是我个人一点猜测而已。不过我相信会有朋友已经碰到或将要碰到同样的问题的,希望高手出手相助。

afan 发表于 2012-7-5 15:01:08

GetTextFromRect 一直就有效,无效是因为你指定的参数无效而已。关键是 CaptureInteractive 如何获得矩形坐标,不然还得自己写额外的坐标获取代码。

afan 发表于 2012-7-5 15:04:42

回复 10# leoking71


    我是阿凡,非达人也~ 当然更不是阿凡达 ^ ^
那个就算窗口句柄取正确了也肯定获取不到文字,因为很有可能是画上去的。

leoking71 发表于 2012-7-5 15:12:55

回复leoking71


    我是阿凡,非达人也~ 当然更不是阿凡达 ^ ^
那个就算窗口句柄取正确了也肯定获 ...
afan 发表于 2012-7-5 15:04 http://www.autoitx.com/images/common/back.gif

阿凡,我试过了,直接打开Aqua,用手工取词的方式(即,按住Ctrl和Shift键),然后鼠标随便对那个屏幕上的任一个数字画出个矩形,是可以取到数字的!说明那些数字不是一副画,而是可以被Aqua识别并取到的:)

kevinch 发表于 2012-7-5 15:39:24

9楼附件里的TcaptureX.dll只有41k,我这里这个竟然有229k,什么原因呢?

leoking71 发表于 2012-7-5 16:46:33

阿凡,我试过了,直接打开Aqua,用手工取词的方式(即,按住Ctrl和Shift键),然后鼠标随便对那个屏幕上 ...
leoking71 发表于 2012-7-5 15:12 http://www.autoitx.com/images/common/back.gif

亲爱的阿凡,我刚才编了段测试脚本重新去屏幕取词那个“博易大师”里的数字,居然取到了,用的是GetTextFromRect方法,看来Aqua对于三胞胎窗口具有一刀切的本领啊。原来的取不到词的问题是出在我原来的那个TcaptureX.dll的文件身上。曾经用过一段时间是正常的,突然失效了从而造成自己迷惑而一时不能察觉,估计原来用的是个正版的试用版,到期了自动失效了。。。现在用的dll至少现在是有效的。
谢谢大家的帮助。顺带,你编的那个Wprobe真是不错,感觉比AutoIt自带的win info tool更好!
{:face (356):}

顺带问一句,已经解决的问题到哪去把它改成“已解决”呀?好像在编辑里的分类里找不到这个选项嘛。
页: [1] 2 3
查看完整版本: 屏幕取词的一些研究与探讨(已解决)