jiaosc 发表于 2013-8-9 15:58:21

编辑框控件号经常无规律变化,如何准确的读取编辑框控件中的文本,...已解决

本帖最后由 jiaosc 于 2013-8-19 09:14 编辑

编辑框控件号经常无规律变化,读取编辑框控件中的文本时有时无,头痛,请大师们指教一二,给个解决的方案。

user3000 发表于 2013-8-9 18:49:56

回复 1# jiaosc

以控件类别来识别呢?
没有办法时,可以再考虑坐标法。

jiaosc 发表于 2013-8-12 16:52:25

请问楼上, 如何用坐标法读取编辑框控件中的文本?请指教。

jiaosc 发表于 2013-8-14 11:42:10

劳驾诸位大师教一教用坐标法读取编辑框控件中的文本的方法,提前感谢了!

user3000 发表于 2013-8-14 13:06:47

不是有窗口信息工具吗?
论坛不是有很多类似内容的帖子吗? 要学会搜索呀.
下面核心代码来自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

jiaosc 发表于 2013-8-15 09:06:09

非常感谢,下来试试。

jiaosc 发表于 2013-8-15 16:02:11

经测试,上述代码可以读取到鼠标所在位置编辑框内的字符,但问题是:1.不能正确显示中文字符,何故?;2.只返回了数字型字符的第一个字符,我想要返回全部字符请问怎么设置?请大师们不要见笑,我快60岁的人了,在大学根本没学过编程,在这方面可以说还是一个文盲,所以最好还是请大师们在上述代码上给标上注释将不胜感激!谢谢大家了!

user3000 发表于 2013-8-15 19:16:02

回复 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 15:52:18

本帖最后由 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-16 18:40:22

本帖最后由 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 获取所有控件类后,再分解获取此控件的类名....自己尝试吧

user3000 发表于 2013-8-16 21:22:13

再给你发一个.....闲逛论坛刚看着...来自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

jiaosc 发表于 2013-8-17 11:03:06

再一次谢谢user3000老弟的耐心指导,根据您的提示,下来自己在琢磨尝试一下,谢谢!

jiaosc 发表于 2013-8-19 09:09:05

本帖最后由 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)

fisher 发表于 2014-1-11 16:46:17

遇到类似问题,控件号常变,控件文本不变。
直接通过控件文本操作不可行,由文本倒读控件号,再由控件号操作。
页: [1]
查看完整版本: 编辑框控件号经常无规律变化,如何准确的读取编辑框控件中的文本,...已解决