编辑框控件号经常无规律变化,如何准确的读取编辑框控件中的文本,...已解决
本帖最后由 jiaosc 于 2013-8-19 09:14 编辑编辑框控件号经常无规律变化,读取编辑框控件中的文本时有时无,头痛,请大师们指教一二,给个解决的方案。 回复 1# jiaosc
以控件类别来识别呢?
没有办法时,可以再考虑坐标法。 请问楼上, 如何用坐标法读取编辑框控件中的文本?请指教。 劳驾诸位大师教一教用坐标法读取编辑框控件中的文本的方法,提前感谢了! 不是有窗口信息工具吗?
论坛不是有很多类似内容的帖子吗? 要学会搜索呀.
下面核心代码来自P版,不一定用得上.#include <WinAPI.au3>
HotKeySet('{f5}', '_get_text_from_MousePos')
HotKeySet('{esc}', '_exit')
While 1
Sleep(50)
WEnd
Func _exit()
Exit
EndFunc
Func _get_text_from_MousePos()
Local $return
$iMousePos = MouseGetPos()
$tPoint = DllStructCreate($tagPoint)
DllStructSetData($tPoint, 1, $iMousePos)
DllStructSetData($tPoint, 2, $iMousePos)
$hWin = _WinAPI_WindowFromPoint($tPoint)
$iLength = _SendMessage($hWin, 0xE) + 100
$tBuffer = DllStructCreate("char[" & $iLength & "]")
$pBuffer = DllStructGetPtr($tBuffer)
_SendMessage($hWin, 0xD, $iLength , $pBuffer)
$return = DllStructGetData($tBuffer, 1)
$tBuffer = 0
MsgBox(0, $hWin, $return)
EndFunc 非常感谢,下来试试。 经测试,上述代码可以读取到鼠标所在位置编辑框内的字符,但问题是:1.不能正确显示中文字符,何故?;2.只返回了数字型字符的第一个字符,我想要返回全部字符请问怎么设置?请大师们不要见笑,我快60岁的人了,在大学根本没学过编程,在这方面可以说还是一个文盲,所以最好还是请大师们在上述代码上给标上注释将不胜感激!谢谢大家了! 回复 7# jiaosc
原来是位老大哥,失敬!
老大哥,比照于你现在的编程基础, 我似乎扯太远了. 我们扯近点吧.
下面的内容截取自是帮助里关于控件使用的说明.("使用autoit ----> 控件使用" 篇)
...
TEXT - 控件上的文本,例如: 按钮上显示的 "下一步(&N)"
CLASS -内部控件的"类"名称,如 "Edit" 或者 "Button"
CLASSNN - 类别名, 如: "Edit1"
NAME - 内部 .NET Framework WinForms 名称 (如果有效)
REGEXPCLASS - 控件类名使用 正则表达式
X(坐标) \ Y(坐标) \ W(宽度) \ H(高度) - 控件坐标与大小.
INSTANCE - 基于1开始的实例(instance) 由程序自动分配的唯一标识.
.... 本帖最后由 jiaosc 于 2013-8-16 16:16 编辑
user3000老弟:
非常感谢你的热心指教,你提及的“控件使用的说明”我已看过,但我现在的问题是:CLASSNN - 类别名, 如: "Edit1" 这个由程序自动分配的唯一标识,它经常会变,有时变为Edit7,有时又变为Edit10.....我无法可靠的读取它的文本内容作为程序下步操作的依据,你上次贴上的通过坐标读取控件的文本代码,我试过可以读取,但只能读取第一个字符,我想读取全部字符,不知如何设置,还请指教。谢谢!
#include <WinAPI.au3>
HotKeySet('{f5}', '_get_text_from_MousePos')
HotKeySet('{esc}', '_exit')
While 1
Sleep(50)
WEnd
Func _exit()
Exit
EndFunc
Func _get_text_from_MousePos()
Local $return
$iMousePos = MouseGetPos()
$tPoint = DllStructCreate($tagPoint)
DllStructSetData($tPoint, 1, $iMousePos)
DllStructSetData($tPoint, 2, $iMousePos)
$hWin = _WinAPI_WindowFromPoint($tPoint)
$iLength = _SendMessage($hWin, 0xE) + 100 ;这里是什么意思,如何设置?具体设置规则及书写格式?
$tBuffer = DllStructCreate("char[" & $iLength & "]") ;还有这里..................
$pBuffer = DllStructGetPtr($tBuffer)
_SendMessage($hWin, 0xD, $iLength , $pBuffer) ;这里............
$return = DllStructGetData($tBuffer, 1) ;这里.........$return 只返回了第一个字符.怎么设置能返回全部字符?
$tBuffer = 0
MsgBox(0, $hWin, $return)
EndFunc
以上代码可以读取到鼠标所在位置控件上文本的第一个字符,我想读取全部字符如何修改代码? 本帖最后由 user3000 于 2013-8-17 12:25 编辑
回复 9# jiaosc
回复个人,请点击某帖层后面的"回复", 这样他登录论坛后会第一时间看到你给他的回复!
关于5楼我帖出来的代码,我很想给你详细的注释,但...实在不是一两句话能解释,而我又懒得敲这么多字,所以我只能建议你在论坛搜索关键字"鼠标 文字" 或 "取词",去翻看相关帖子;如果你确实想知道的话.
话说回来, 我让你翻看帮助'控件使用', 其实就是想让你知道,使用或引用控件时,有那么多种方式,而不一定是使用 "ID", 或 CLASSNN. 像你现在就可以尝试用"REGEXPCLASS"$sText = ControlGetText($sTitle, '', ')当然一般刚接触AU3的人,根本无法使用正则,那么我们可以再换个方法.;取文字前必须确保该控件有输入焦点
$sClassNN = ControlGetFocus($sTitle, '')
$sText =ControlGetText($sTitle, '', '')如果不能确定输入焦点所在,那我们可以先点击下控件! 激活窗口,按控件所在的坐标,进行鼠标点击!
WinActivate($sTitle)
Opt('MouseCoordMode', 2) ;鼠标函数参数 2 = 相对激活窗口客户区的坐标
MouseClick('left',111, 222, 1, 0)
; 用窗口信息工具可以确定 '111' 和 '222' 的值!
; 但捕捉窗口坐标前,记得要先选中 "选项" --->"坐标模式"--->"客户区域"
还可以用 WinGetClassList 获取所有控件类后,再分解获取此控件的类名....自己尝试吧 再给你发一个.....闲逛论坛刚看着...来自Afan超版,我们A大的杰作.
你也应该明白了,真正的大师的水平!可惜他们很少有时间啊!Func _GetWinInfoFromPoint($title, $text, $_x, $_y, $RtFlag = 1)
;afan提示:本函数用于获取窗口指定坐标点包含的窗口(控件)的句柄、id、文本信息
;$title - 窗口标题(也可直接使用句柄)
;$text - 窗口文本(如果$title使用句柄则该参数被忽略)
;$_x - 控件相对窗口坐标x
;$_y - 控件相对窗口坐标y
;$RtFlag - 返回信息标志[可选参数]
; = 1 返回窗口(或控件)句柄(默认)
; = 2 返回控件的内部标识符(id)
; = 3 返回控件文本
;返回值:@Error =0 根据返回标志返回字符串信息
; @Error =1:未匹配到目标窗口;=2:检索句柄错误;=3:检索id错误;=4:拾取控件文本错误
Local $hWnd = Hwnd($title)
If Not IsHwnd($hWnd) Then
$hWnd = WinGetHandle($title, $text)
If @Error Then Return SetError(1, '', '')
EndIf
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, '', '')
$hStatic = $aRt0
Switch $RtFlag
Case 1
Return $hStatic
Case 2
Local $aRt1 = DllCall('user32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hStatic)
If @error Then Return SetError(3, '', '')
Return $aRt1
Case 3
Local $sTxt = ControlGetText($hWnd, '', $hStatic)
If @error Then Return SetError(4, '', '')
Return $sTxt
EndSwitch
EndFunc ;==>_GetWinInfoFromPoint 再一次谢谢user3000老弟的耐心指导,根据您的提示,下来自己在琢磨尝试一下,谢谢! 本帖最后由 jiaosc 于 2013-8-19 09:12 编辑
通过user3000老弟的指点“使用或引用控件时,有那么多种方式,而不一定是使用 "ID", 或 CLASSNN....",茅塞顿开,此问题已通过如下代码,得到了圆满解决,再一次表示感谢!
附代码:
;获取可买股数
$xiadanfiletext= WinGetText ("网上股票交易系统5.0")
$xiadanfile=FileOpen("xiadanfile.txt",2+8)
FileWrite("xiadanfile.txt",$xiadanfiletext)
$mrkemai=Number(FileReadLine("xiadanfile.txt",6))
FileClose($xiadanfile)
MsgBox(0,”获取可买股数“, $mrkemai) 遇到类似问题,控件号常变,控件文本不变。
直接通过控件文本操作不可行,由文本倒读控件号,再由控件号操作。
页:
[1]