cashiba 发表于 2016-3-15 22:11:36

请教如何获取控件编辑框中的文本[已解决]

本帖最后由 cashiba 于 2016-3-17 19:52 编辑


如上图,请问有什么函数可以得到其中所有类名为"EDIT"的控件的编辑框中的文本?
#include<WinAPISys.au3>
_WinAPI_EnumChildWindows ( $hWnd [, $bVisible = True] )
目前采取的办法:_WinAPI_EnumChildWindows得到所有的子窗体的句柄和类名,然后用for...next循环过滤后的生成一个符合条件的只含"EDIT"的新数组....
再用
ControlGetText("标题", "文本", 控件ID)
得到"EDIT"框中的文本。
但是很奇怪,得不到结果{:face (319):}
请大神和老师们提点一下,万谢!

之前在按键里用类似下面形式的函数可以取得文本值,不知道ControlGetText的原型是不是也是这个

Func GetText($Arg_hwnd)
   Dim $S_TextLen,$S_strText
   $S_TextLen = SendMessage($Arg_hwnd, &HE, 0, 0)
   $S_strText = Space($S_TextLen)
   SendMessage($Arg_hwnd, &HD, $S_TextLen+1, $S_strText)
   return $S_strText
EndFunc

haijie1223 发表于 2016-3-16 10:27:27

目标程序是什么

afan 发表于 2016-3-16 16:26:00

LZ应该贴出你的代码,这样光解释没有实际测试代码也是白搭

cashiba 发表于 2016-3-16 18:58:34

本帖最后由 cashiba 于 2016-3-16 19:03 编辑

LZ应该贴出你的代码,这样光解释没有实际测试代码也是白搭
afan 发表于 2016-3-16 16:26 http://www.autoitx.com/images/common/back.gif
谢谢两位版长!刚接触Au,代码写得少,也很简单。但是还卡在构造数组上了{:face (229):}

#include <WindowsConstants.au3>
#include <stringConstants.au3>
#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <Array.au3>

Dim $biaoti,$H0,$H1,$H2
$biaoti="信息平台"
Opt("WinTitleMatchMode")
$H0= WinGetHandle($biaoti)
ConsoleWrite($H0 & @CRLF);
$H1= ControlGetHandle($H0,"","")
ConsoleWrite($H1 & @CRLF);
$H2= ControlGetHandle($H1,"","")
ConsoleWrite($H2 & @CRLF);
Local $HsArr =_WinAPI_EnumChildWindows($H2,0)
If IsArray($HsArr) Then _ArrayDisplay($HsArr, '_WinAPI_EnumChildWindows')
以上运行正常,结果如下:

>运行:C:\Program Files\AutoIt3\autoit3.exe(3.3.14.2), 脚本: C:\Program Files\AutoIt3\autoit3.exe "C:\Documents and Settings\Administrator\My Documents\GetCtrlinfo5.au3"   
--> 点击 Ctrl+Alt+Break 重新启动, 或 Ctrl+Break 停止脚本执行
0x000500F4
0x00060126
0x0004028C

+>08:11:50 AutoIt3.exe 结束.rc: 0
+>08:11:50 AutoIt3Wrapper 完成脚本处理.
>Exit code: 0    Time: 3.312
下面打算从数组$HsArr中(见上图)过滤出"EDIT"类名的控件形成新数组$HsBrr,可惜对AU数组不熟,一直报错
dim $n=0
dim $HsBrr[$n]
for $i=0 to ubound($Hsarr,1)-1
        if $HsArr[$i] ="Edit" then
           ;redim preserve $HsBrr[$n]
       $HsBrr[$n]=H$HsArr[$i]
           $HsBrr[$n]=$HsArr[$i]
           $n =$n+1
        EndIf
next
_ArrayDisplay($Hsbrr, '_WinAPI_EnumChildWindows')
最后是根据数组$HsBrr中的句柄和类名得到编辑框文本
for $i=0 to ubound($Hsbrr,1)-1
    $sText = ControlGetText($Hsbrr[$i], "", $Hsbrr[$i]);显示编辑控件的文本.
    ConsoleWrite($sText & @CRLF)
        $sText=""
next

afan 发表于 2016-3-16 21:42:46

新数组创建Dim $n = 0
Dim $HsBrr
For $i = 0 To UBound($Hsarr) - 1
        If $HsArr[$i] = "Edit" Then
                ;redim preserve $HsBrr[$n]
                $HsBrr[$n] = $HsArr[$i]
                $HsBrr[$n] = $HsArr[$i]
                $n += 1
        EndIf
Next
If $n > 0 Then ReDim $HsBrr[$n]
_ArrayDisplay($HsBrr, '_WinAPI_EnumChildWindows')

cashiba 发表于 2016-3-16 22:08:12

本帖最后由 cashiba 于 2016-3-17 10:02 编辑

private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
   Const WM_GETTEXT = &HD
   const WM_GETTEXTLENGTH=&HE
Func GetText($Arg_hwnd)
   Dim $S_TextLen,$S_strText
   $S_TextLen = SendMessage($Arg_hwnd, WM_GETTEXTLENGTH,0, 0)
   $S_strText = Space($S_TextLen)
   SendMessage($Arg_hwnd, WM_GETTEXT, $S_TextLen+1, $S_strText)
   return $S_strText
EndFunc新手不知道如何使用dllcall,请问如何修改一下,改成AU3中可用的函数呢?报错大概是&HE、&HD未定义,怎么改呢?

cashiba 发表于 2016-3-16 22:18:33

新数组创建
afan 发表于 2016-3-16 21:42 http://www.autoitx.com/images/common/back.gif经测试成功,谢谢aFan版主费心!以前VB构造动态数组,需要preserve保留数据,而且只能改变第二维,第一维不能变。AU3中数组讲得都不多,也没见到动态、静态数组的说法。还得慢慢适应...
页: [1]
查看完整版本: 请教如何获取控件编辑框中的文本[已解决]