找回密码
 加入
搜索
楼主: yufei8051

[AU3基础] (已解决)请教如何获得气泡提示窗口中的文字?

 火.. [复制链接]
发表于 2012-11-18 22:15:41 | 显示全部楼层
回复 30# yufei8051


   好像看出这两段的规律了
发表于 2012-11-18 22:27:39 | 显示全部楼层
Local $Str = _
                '大白菜6分钱一斤无人问津 多地菜农无奈' & @CRLF & _
                '弃收 蔬菜价格全面下跌' & @CRLF & @CRLF & _
                '君临天下2009 ' & @CRLF & @CRLF & _
                '★娱乐区★★灌水贴★(禁止使用灌水机' & @CRLF & _
                ',违者清空积分 ...' & @CRLF & @CRLF & _
                '设置关注' & @CRLF & _
                '清除信息' & @CRLF & _
                '22/22' & @CRLF & _
                '<11' & @CRLF & @CRLF & _
                '-' & @CRLF & @CRLF & _
                '18' & @CRLF & @CRLF & @CRLF & @CRLF & _
                '21' & @CRLF & @CRLF & _
                ':' & @CRLF & @CRLF & _
                '45>'
MsgBox(0, '原字符串', $Str)
Local $sRER = StringRegExpReplace($str, '\r\n(?!\r)', '')
Local $aSR = StringRegExp($sRER, '(?:\V+\v+){3}', 1)
If Not @Error Then MsgBox(0, '整体取', $aSR[0])
Local $aSR1 = StringRegExp($sRER, '\V+', 3)
If Not @Error Then MsgBox(0, '分开取', '第一行:' & @TAB & $aSR1[0] & @CRLF & _
                                        '第二行:' & @TAB & $aSR1[1] & @CRLF & _
                                        '第三行:' & @TAB & $aSR1[2])
 楼主| 发表于 2012-11-19 11:52:11 | 显示全部楼层
本帖最后由 yufei8051 于 2012-11-19 12:03 编辑

回复 32# afan

刚看到超版新回复,非常感谢。
昨天晚上自己琢磨了半天,因为气泡窗口大小不变,想用提取指定坐标处控件id的办法,测试发现这个程序的id不仅仅是每次启动变化,而且在运行中还会变,真变态。费了半天劲,到时能实现功能,但是因为程序要不停的移动焦点,运行朗读就别用电脑了,否则焦点老跑,很麻烦
用超版提供的程序运行完全正常,但是在提取实时数据不行,因为每次窗口中的文本都不相同,每段字数也不一样。
        现在看只能用这种先获取气泡窗口所有文本再分别取出的办法了。

       观察提取出的文本,在每段之间都有一个空行,可否这样:
       比如把提取的文字保存到aa,然后提取从头开始的文字直到遇到第一个空行,将其保存到变量1,把aa中的这一段删除,再次提取aa中从开始到遇到空行处的所有文字保存到变量2,余此类推。
           不知道正则表达式能否实现?
 楼主| 发表于 2012-11-19 12:01:29 | 显示全部楼层
本帖最后由 yufei8051 于 2012-11-19 14:10 编辑

昨天晚上使用的方法,先获取指定坐标处句柄,再根据句柄获取类别名。所有源码:
#include <WinAPI.au3>
#include <Date.au3>
#include <Array.au3>
HotKeySet('{esc}', '_Exit')
Local $o_speech, $Flag = 0, $hWnd, $sAllstring, $sTitle, $sLast, $sAll
Local $zb1, $zb2
Local $GetStatic1x,$GetStatic2x,$GetStatic3x
Local $GetStaticTitile,$GetStaticName ,$GetStaticTxt

;$GetStaticTitile = ControlGetText($hWnd, '', $GetStatic1x);获取标题栏
;GetStaticX()

AdlibRegister('_GetWinTxt',2000)



;分别获取指定控件的id
;GetStaticX()
;Local $zb1, $zb2
;Local $GetStatic1x,$GetStatic2x,$GetStatic3x
Func GetStaticX()
        Local $GetStaticjs,$js
        For $GetStaticjs=1 To 3 Step 1
                ;Local $js
                $js=$js+1
                Switch $js
                        Case 1
                                ;标题
                                $zb1=13
                                $zb2=7
                                _get_ctr_id_by_zb($zb1, $zb2,$hWnd);调用子程序
                                ControlFocus($hWnd,"",_get_ctr_id_by_zb($zb1, $zb2,$hWnd));设置指定控件为当前焦点
                                $GetStatic1x=ControlGetFocus($hWnd)
                                Sleep(100)

                        Case 2        
                                ;网名
                                $zb1=13
                                $zb2=31
                                _get_ctr_id_by_zb($zb1, $zb2,$hWnd);调用子程序
                                ControlFocus($hWnd,"",_get_ctr_id_by_zb($zb1, $zb2,$hWnd));设置指定控件为当前焦点
                                $GetStatic2x=ControlGetFocus($hWnd)
                                Sleep(100)
                
                        Case 3        
                                ;内容
                                $zb1=13
                                $zb2=51
                                _get_ctr_id_by_zb($zb1, $zb2,$hWnd);调用子程序
                                ControlFocus($hWnd,"",_get_ctr_id_by_zb($zb1, $zb2,$hWnd));设置指定控件为当前焦点
                                $GetStatic3x=ControlGetFocus($hWnd)
                                Sleep(100)
                EndSwitch                
        ;MsgBox(262149,"测试FOR次数GetStaticX() :"&$js&"  zb1:"&$zb1&"  zb2:"&$zb2,"标题:" & $GetStatic1x & " 网名:" &  $GetStatic2x & " 文本:" & $GetStatic3x  & @CRLF ,2)                
        Next
        ;MsgBox(262149,"测试FOR次数Next :"&$js&"  zb1:"&$zb1&"  zb2:"&$zb2,"标题:" & $GetStatic1x & " 网名:" &  $GetStatic2x & " 文本:" & $GetStatic3x  & @CRLF ,2)        
        ;$GetStaticTitile=ControlGetText($hWnd, '', $GetStatic1x);获取标题
    ;$GetStaticName=ControlGetText($hWnd, '', $GetStatic2x);获取网名
    ;$GetStaticTxt=ControlGetText($hWnd, '', $GetStatic3x);获取文本
        ;MsgBox(262149,"测 试Next" & "zb1:"&$zb1&"  zb2:"&$zb2,"标题:" & $GetStaticTitile & @CRLF & " 网名:" &  $GetStaticName & @CRLF & " 文本:" & $GetStaticTxt & @CRLF )        
EndFunc



;根据指定坐标获取该控件句柄
Func _get_ctr_id_by_zb($zb1, $zb2,$hWnd )
                Local $tPoint = DllStructCreate($tagPoint);创建一个 C/C++ 样式的数据结构供 DllCall 使用
        DllStructSetData($tPoint, 1, $zb1) ;设置数据结构(struct)中部分元素的数据.   
        DllStructSetData($tPoint, 2, $zb2)     
        _WinAPI_ClientToScreen(WinGetHandle($hWnd ), $tpoint);转换客户区窗口指定点的坐标到一个屏幕坐标
        $hStatic = _WinAPI_WindowFromPoint($tPoint);检索包含指定点的窗口句柄  
            ;Local $controlid 
                ;$controlid = _WinAPI_GetDlgCtrlID($hWnd);检索指定控件的标识符
        ;Return $controlid 
            Return   $hStatic ;返回控任句柄
EndFunc



;主程序
;Local $GetStaticTitile,$GetStaticName ,$GetStaticTxt
Func _GetWinTxt()
                ;$hWnd = WinGetHandle('[CLASS:#32770]', '设置关注')
                $hWnd = WinGetHandle("[CLASS:#32770]","设置关注") 
                ;MsgBox(262149,"测 试",$hWnd ,2);测试专用
        GetStaticX()
                ;MsgBox(262149,"测 试_GetWinTxt" & "zb1:"&$zb1&"  zb2:"&$zb2,"标题:" & $GetStaticTitile & @CRLF & " 网名:" &  $GetStaticName & @CRLF & " 文本:" & $GetStaticTxt & @CRLF )        
            If Not $hWnd Then
                $Flag = 0
                Return 0
                EndIf
                
                $GetStaticTitile = ControlGetText($hWnd, '', $GetStatic1x);获取标题栏
                ;MsgBox(262149,"测 试",$sWin ,2);测试专用

                If StringInStr($GetStaticTitile,"灌水帖")>0 Then                        
                        $sTitle="灌水帖"
                EndIf        
                If StringInStr($GetStaticTitile ,"竞猜")>0 Then                        
                        $sTitle="竞猜"
                EndIf        
                If StringInStr($GetStaticTitile ,"实时看盘")>0 Then                        
                        $sTitle="实时看盘"
                EndIf
                
                $GetStaticName = ControlGetText($hWnd, "", $GetStatic2x)
        $GetStaticTxt = ControlGetText($hWnd, "", $GetStatic3x)
                ;MsgBox(262149,"测 试",$sTitle & @CRLF  & $sName & @CRLF  & $sTxt ,2);测试专用
        $sAll = $sTitle & $GetStaticName & $GetStaticTxt
            If $sAll == $sLast Then
                $Flag = 0
                Return 0
        EndIf
        $Flag = 1
EndFunc   ;==>_GetWinTxt



Func _Exit()
        Exit
EndFunc   ;==>_Exit
        
        
        
;始终检测主程序
While 1
        If $Flag Then
                If $sAll <> $sLast Then
                        FileWrite(@ScriptDir & '\理想通伴侣.txt','[' &_NowDate() & " " & _NowTime() & ']' & @CRLF & "[" & $sTitle & "]" & $GetStaticName& ": “" & $GetStaticTxt & "”" & @CRLF & @CRLF)
                        $sLast = $sAll
                EndIf
                $o_speech = ObjCreate('SAPI.SpVoice')
                ;$o_speech.Speak($sTitle & @CRLF & $sAll, 1)
                                $o_speech.Speak( $sAll, 1)
        Else
                Sleep(1)
        EndIf
WEnd
发表于 2012-11-19 12:09:53 | 显示全部楼层
回复  afan

刚看到超版新回复,非常感谢。
昨天晚上自己琢磨了半天,因为气泡窗口大小不变,想用提取指 ...
yufei8051 发表于 2012-11-19 11:52



    32#的代码就是提取这些的,不会使用变量吗?你所指的变量1就是$aSR1[0],变量2就是$aSR1[1],…… 我的例子已经写得很清楚了
 楼主| 发表于 2012-11-19 14:06:50 | 显示全部楼层
本帖最后由 yufei8051 于 2012-11-19 14:08 编辑

可能是我太菜了,用的不对,
这是我引用时稍作修改的源码,请超版看是不是写的不对:
        $hWnd = WinGetHandle("[CLASS:#32770]","设置关注") 
                ;MsgBox(262149,"测 试",$hWnd ,2);测试专用
        $Str = WinGetText("[CLASS:#32770]","设置关注") ;获取所有文本
                
                ;MsgBox(0, '原字符串', $Str)
                Local $sRER = StringRegExpReplace($str, '\r\n(?!\r)', '')
                Local $aSR = StringRegExp($sRER, '(?:\V+\v+){3}', 1)
                ;If Not @Error Then MsgBox(0, '整体取', $aSR[0])
                Local $aSR1 = StringRegExp($sRER, '\V+', 3)
                ;If Not @Error Then MsgBox(0, '分开取', '第一行:' & @TAB & $aSR1[0] & @CRLF & _
                ;                                                                                '第二行:' & @TAB & $aSR1[1] & @CRLF & _
                ;                                                                                '第三行:' & @TAB & $aSR1[2])
           
                ;MsgBox(262149,"测 试_GetWinTxt" & "zb1:"&$zb1&"  zb2:"&$zb2,"标题:" & $GetStaticTitile & @CRLF & " 网名:" &  $GetStaticName & @CRLF & " 文本:" & $GetStaticTxt & @CRLF )        
            If Not $hWnd Then
                             $Flag = 0
                             Return 0
            EndIf

                $GetStaticTitile = $aSR1[2];获取标题栏
                $GetStaticName = $aSR1[1];获取网名
                     $GetStaticTxt = $aSR1[0];获取正文文本
                ;MsgBox(262149,"测 试",$GetStaticTitile & @CRLF  & $GetStaticName & @CRLF  & $GetStaticTxt,2);测试专用
                
                ;$sAll = $sTitle & $GetStaticName & $GetStaticTxt
                $sAll = $GetStaticTitile & $GetStaticName & $GetStaticTxt
回复 35# afan


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-19 14:12:46 | 显示全部楼层
回复 36# yufei8051


    这样搞复杂了,可以直接取的干嘛走弯路,一会贴个获取窗口指定点控件文本的函数
 楼主| 发表于 2012-11-19 14:21:51 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2012-11-19 14:23:00 | 显示全部楼层
回复 37# afan


    哪一部分?看不懂啊
 楼主| 发表于 2012-11-19 14:32:20 | 显示全部楼层
回复  yufei8051


    这样搞复杂了,可以直接取的干嘛走弯路,一会贴个获取窗口指定点控件文本的函数
afan 发表于 2012-11-19 14:12



    可以直接指定控件取出文本,用这个函数 ControlGetTex
问题是控件的id老变,不可靠。
比如
>>>> 控件信息 <<<<   
类名:        Static
接口:        5
类别名:        Static5
名称:       
高级模式(类):[CLASS:Static; INSTANCE:5]
里面的Static5,现在是Static5,没准一会变成Static7了。其他的两个控件的值也是一样。
所以没办法。
发表于 2012-11-19 14:34:31 | 显示全部楼层
回复 40# yufei8051
$s = _GetWinTextFromPoint('[CLASS:#32770]', '设置关注', 13, 7)
MsgBox(0, '标题', $s)
$s = _GetWinTextFromPoint('[CLASS:#32770]', '设置关注', 13, 51)
MsgBox(0, '内容', $s)
$s = _GetWinTextFromPoint('[CLASS:#32770]', '设置关注', 13, 31)
MsgBox(0, '网名', $s)

Func _GetWinTextFromPoint($title, $text, $_x, $_y)
        ;afan提示:获取窗口指定坐标点包含的窗口(控件)的文本
        Local $hWnd = WinGetHandle($title, $text)
        Local $tPoint = DllStructCreate('long X;long Y')
        DllStructSetData($tPoint, 1, $_x)
        DllStructSetData($tPoint, 2, $_y)
        DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tPoint))
        Local $tPointCast = DllStructCreate('int64', DllStructGetPtr($tPoint))
        Local $aRt0 = DllCall('user32.dll', 'hwnd', 'WindowFromPoint', 'int64', DllStructGetData($tPointCast, 1))
        If @error Then Return SetError(2, '', '')
        Return ControlGetText($hWnd, '', $aRt0[0])
EndFunc   ;==>_GetWinTextFromPoint
 楼主| 发表于 2012-11-19 14:44:46 | 显示全部楼层
回复 41# afan
请问超版,这一句:
_GetWinTextFromPoint($title, $text, $_x, $_y)
在哪里调用啊?是在
Func _GetWinTxt()
这里吧?
我上面34楼好像就是用这个方法,倒是能实现要求,就是太占资源,运行该程序,电脑几乎就不能干别的事了
麻烦你看看34楼完整的源码,是不是 _GetWinTextFromPoint($title, $text, $_x, $_y)
这部分我调用的地方不对?
发表于 2012-11-19 14:46:37 | 显示全部楼层
回复  afan
请问超版,这一句:
_GetWinTextFromPoint($title, $text, $_x, $_y)
在哪里调用啊?是在
...
yufei8051 发表于 2012-11-19 14:44



    正确获取到了没?
 楼主| 发表于 2012-11-19 14:56:30 | 显示全部楼层
回复 43# afan


    取到了!
奇怪的是,你在上面三个变量的名字都是一样的,系统怎么会同意呢?
还有,都是一样的变量名称,怎么取呢?
 楼主| 发表于 2012-11-19 14:59:27 | 显示全部楼层
afan 发表于 2012-11-17 22:36


请教超版
怎么把代码加到你9楼的代码里面呢?
加到哪一步分啊?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 15:39 , Processed in 0.070940 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表