afan 发表于 2012-11-18 22:15:41

回复 30# yufei8051


   好像看出这两段的规律了

afan 发表于 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)
Local $aSR1 = StringRegExp($sRER, '\V+', 3)
If Not @Error Then MsgBox(0, '分开取', '第一行:' & @TAB & $aSR1 & @CRLF & _
                                        '第二行:' & @TAB & $aSR1 & @CRLF & _
                                        '第三行:' & @TAB & $aSR1)

yufei8051 发表于 2012-11-19 11:52:11

本帖最后由 yufei8051 于 2012-11-19 12:03 编辑

回复 32# afan

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

       观察提取出的文本,在每段之间都有一个空行,可否这样:
       比如把提取的文字保存到aa,然后提取从头开始的文字直到遇到第一个空行,将其保存到变量1,把aa中的这一段删除,再次提取aa中从开始到遇到空行处的所有文字保存到变量2,余此类推。
         不知道正则表达式能否实现?

yufei8051 发表于 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('', '设置关注')
                $hWnd = WinGetHandle("","设置关注")
                ;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

afan 发表于 2012-11-19 12:09:53

回复afan

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


    32#的代码就是提取这些的,不会使用变量吗?你所指的变量1就是$aSR1,变量2就是$aSR1,…… 我的例子已经写得很清楚了

yufei8051 发表于 2012-11-19 14:06:50

本帖最后由 yufei8051 于 2012-11-19 14:08 编辑

可能是我太菜了,用的不对,{:face (229):}
这是我引用时稍作修改的源码,请超版看是不是写的不对:        $hWnd = WinGetHandle("","设置关注")
                ;MsgBox(262149,"测 试",$hWnd ,2);测试专用
      $Str = WinGetText("","设置关注") ;获取所有文本
               
                ;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)
                Local $aSR1 = StringRegExp($sRER, '\V+', 3)
                ;If Not @Error Then MsgBox(0, '分开取', '第一行:' & @TAB & $aSR1 & @CRLF & _
                ;                                                                                '第二行:' & @TAB & $aSR1 & @CRLF & _
                ;                                                                                '第三行:' & @TAB & $aSR1)
          
                ;MsgBox(262149,"测 试_GetWinTxt" & "zb1:"&$zb1&"zb2:"&$zb2,"标题:" & $GetStaticTitile & @CRLF & " 网名:" &$GetStaticName & @CRLF & " 文本:" & $GetStaticTxt & @CRLF )       
          If Not $hWnd Then
                           $Flag = 0
                           Return 0
          EndIf

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


afan 发表于 2012-11-19 14:12:46

回复 36# yufei8051


    这样搞复杂了,可以直接取的干嘛走弯路,一会贴个获取窗口指定点控件文本的函数

yufei8051 发表于 2012-11-19 14:21:51

yufei8051 发表于 2012-11-19 14:23:00

回复 37# afan


    哪一部分?看不懂啊{:face (396):}

yufei8051 发表于 2012-11-19 14:32:20

回复yufei8051


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


    可以直接指定控件取出文本,用这个函数 ControlGetTex
问题是控件的id老变,不可靠。
比如
>>>> 控件信息 <<<<   
类名:        Static
接口:        5
类别名:        Static5
名称:       
高级模式(类):
里面的Static5,现在是Static5,没准一会变成Static7了。其他的两个控件的值也是一样。
所以没办法。

afan 发表于 2012-11-19 14:34:31

回复 40# yufei8051 $s = _GetWinTextFromPoint('', '设置关注', 13, 7)
MsgBox(0, '标题', $s)
$s = _GetWinTextFromPoint('', '设置关注', 13, 51)
MsgBox(0, '内容', $s)
$s = _GetWinTextFromPoint('', '设置关注', 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)
EndFunc   ;==>_GetWinTextFromPoint

yufei8051 发表于 2012-11-19 14:44:46

回复 41# afan
请问超版,这一句:
_GetWinTextFromPoint($title, $text, $_x, $_y)
在哪里调用啊?是在
Func _GetWinTxt()
这里吧?
我上面34楼好像就是用这个方法,倒是能实现要求,就是太占资源,运行该程序,电脑几乎就不能干别的事了
麻烦你看看34楼完整的源码,是不是 _GetWinTextFromPoint($title, $text, $_x, $_y)
这部分我调用的地方不对?

afan 发表于 2012-11-19 14:46:37

回复afan
请问超版,这一句:
_GetWinTextFromPoint($title, $text, $_x, $_y)
在哪里调用啊?是在
...
yufei8051 发表于 2012-11-19 14:44 http://www.autoitx.com/images/common/back.gif


    正确获取到了没?

yufei8051 发表于 2012-11-19 14:56:30

回复 43# afan


    取到了!
奇怪的是,你在上面三个变量的名字都是一样的,系统怎么会同意呢?
还有,都是一样的变量名称,怎么取呢?

yufei8051 发表于 2012-11-19 14:59:27


afan 发表于 2012-11-17 22:36 http://www.autoitx.com/images/common/back.gif

请教超版
怎么把代码加到你9楼的代码里面呢?
加到哪一步分啊?
页: 1 2 [3] 4
查看完整版本: (已解决)请教如何获得气泡提示窗口中的文字?