(已解决)请教如何获得气泡提示窗口中的文字?
本帖最后由 yufei8051 于 2012-11-20 16:17 编辑好像取不到啊,它弹出来的时候是不是就已经激活了呢?
用下面的代码,有窗口弹出也不显示,必须点击一下气泡窗口才行。气泡窗口的句柄是:0x0003051AControlFocus("","",0x0003051A);激活"气泡窗口""对话框
Local $Getstringx=WinGetText ("") ;获取对话框字符串
If StringInStr ($Getstringx, "【动物园】")>0 Then
MsgBox(262149,"测试:",$Getstringx,10)
endif
比如上面图的那个气泡窗口。
我的想法是,写一个脚本,让它监视有否气泡窗口弹出,若有则获取其内容写到一个文件中,重复此过程。
哪位大侠给个方法?楼下链接没看明白啊,水平太菜 autoitx.com/forum.php?mod=viewthread&tid=30395
内容相关,可惜没看懂。
继续研究 看长相也不是气泡,零件多了点… 感谢超版关注回复。
但它确实是从气泡那儿冒出来的,用信息工具也看不到控件,也没有窗口标题,有句柄。
还有 用信息工具看, 黑体字的窗体标题那文字其实都是内容
回去我把信息工具的截图发上来。
内容
本帖最后由 半芯竹 于 2012-11-16 23:04 编辑回复 1# yufei8051
#Include <Date.au3>
Local $a,$b
While 1
If WinExists ("【动物园】") then
$a=WinGetText ("【动物园】")
If $b <> $a Then
IniWrite("my.ini", "记录", _NowTime(), $a )
$b=$a
EndIf
Else
$b=''
EndIf
Sleep(300)
WEnd
如果获取到的,都是窗体内容,那就这样尝试:
#Include <Date.au3>
Local $a,$b
While 1
If WinExists ('',"【动物园】") then
$a=WinGetText ('',"【动物园】")
If $b <> $a Then
IniWrite("my.ini", "记录", _NowTime(), $a )
$b=$a
EndIf
Else
$b=''
EndIf
Sleep(300)
WEnd 回复yufei8051
如果获取到的,都是窗体内容,那就这样尝试:
半芯竹 发表于 2012-11-16 23:00 http://www.autoitx.com/images/common/back.gif
感谢你的关注。
经试验,第一段代码好像不行。
第二段代码可以取到气泡窗口的数据,问题是,不仅仅有气泡提示窗口的,所有激活窗口的信息都有,有点乱。
我想只提取气泡窗口的文本。请问怎么改一下? 回复 3# afan
气泡窗口:
这是用信息工具查到的:
本帖最后由 yufei8051 于 2012-11-17 16:12 编辑
回复 5# 半芯竹
用了你的第二段代码, 基本解决。#Include <Date.au3>
Local $a,$b,$a1,$a2
While 1
If WinExists ('',"灌水贴") then
$a1=ControlGetText("","灌水贴","")
$a2=ControlGetText("","灌水贴","")
$a=$a1&$a2
If $b <> $a Then
IniWrite("my.ini", "记录", _NowTime(), $a)
_TalkOBJ($a)
$b=$a
EndIf
Else
$b=''
EndIf
Sleep(300)
WEnd
;文本语言朗读
;_TalkOBJ('This is auto it beta speaking.')
_TalkOBJ($a)
Func _TalkOBJ($s_text)
Local $o_speech = ObjCreate("SAPI.SpVoice")
$o_speech.Speak($s_text)
$o_speech = ""
EndFunc我是这样计划的:把气泡窗口的文本写入文件,同时让他即时朗读。
目前看基本实现。
存在的问题:如果在朗读过程中有新气泡弹出,该条信息就不能写入文件也不会朗读,也就是说会丢包。
怎么解决这个问题?
{:face (356):} ...存在的问题:如果在朗读过程中有新气泡弹出,该条信息就不能写入文件也不会朗读,也就是说会丢包 ...
yufei8051 发表于 2012-11-17 16:10 http://www.autoitx.com/images/common/back.gif#include <Date.au3>
HotKeySet('{esc}', '_Exit')
Local $o_speech, $Flag = 0, $hWnd, $sTitle, $sTxt, $sLast, $sAll
AdlibRegister('_GetWinTxt')
While 1
If $Flag Then
If $sAll <> $sLast Then
FileWrite(@ScriptDir & '\my.txt', '[' & _NowTime() & ']' & @CRLF & $sAll & @CRLF & @CRLF)
$sLast = $sAll
EndIf
$o_speech = ObjCreate('SAPI.SpVoice')
$o_speech.Speak($sTitle & @CRLF & $sAll, 1)
Else
Sleep(1)
EndIf
WEnd
Func _GetWinTxt()
$hWnd = WinGetHandle('', '设置关注')
If Not $hWnd Then
$Flag = 0
Return 0
EndIf
$sTitle = ControlGetText($hWnd, '', '')
$sTxt = ControlGetText($hWnd, '', '')
$sAll = $sTitle & @CRLF & $sTxt
If $sAll == $sLast Then
$Flag = 0
Return 0
EndIf
$Flag = 1
EndFunc ;==>_GetWinTxt
Func _Exit()
Exit
EndFunc ;==>_Exit 本帖最后由 yufei8051 于 2012-11-18 13:07 编辑
回复 9# afan
感谢超版回复。
经试验,代码工作正常,可以达到效果。
多次测试后问题又来了,像
CLASS:Static; INSTANCE:4]'
CLASS:Static; INSTANCE:2]'
之类的数值是会变的,所以有时能行,有时不行。
所以我想只能用
$hWnd = WinGetHandle("","设置关注")
$sAllstring = WinGetText($hWnd) ;获取所有文本
先读出所有字符串,然后再把各个部分分别取出来,这样肯定就没问题了。
如图:
取出的字符串分为几部分,如图中方框所示,其中第一行是空行,第二行是发言内容,第三行是发言者网名,第四行是显示在气泡窗口上面的黑体字的标题,下面的不用关注。
请教怎么分别取出这几部分?用StringLeft 之类的函数没法达到目的 有句柄就好说了,用api去取 回复 11# netegg
能详细说下嘛? 回复 10# yufei8051
用什么函数可以取出字符串中从开始到第一个回车之间的字符?
包括取出从第二个回车到第三个回车之间的所有字符? 本帖最后由 netegg 于 2012-11-18 14:29 编辑
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/8fe110f0-cda4-41aa-aab0-480c95951636/
http://stackoverflow.com/questions/1333770/how-to-get-tooltip-text-for-a-given-hwnd 回复 14# netegg
感谢回复。
可惜都是英文,看不懂啊。