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楼的代码里面呢?
加到哪一步分啊?