找回密码
 加入
搜索
查看: 4250|回复: 6

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

  [复制链接]
发表于 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"框中的文本。
但是很奇怪,得不到结果
请大神和老师们提点一下,万谢!

之前在按键里用类似下面形式的函数可以取得文本值,不知道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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-3-16 10:27:27 | 显示全部楼层
目标程序是什么
发表于 2016-3-16 16:26:00 | 显示全部楼层
LZ应该贴出你的代码,这样光解释没有实际测试代码也是白搭
 楼主| 发表于 2016-3-16 18:58:34 | 显示全部楼层
本帖最后由 cashiba 于 2016-3-16 19:03 编辑
LZ应该贴出你的代码,这样光解释没有实际测试代码也是白搭
afan 发表于 2016-3-16 16:26

谢谢两位版长!刚接触Au,代码写得少,也很简单。但是还卡在构造数组上了
#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,"","[CLASS:MDIClient;INSTANCE:1]")
ConsoleWrite($H1 & @CRLF);
$H2= ControlGetHandle($H1,"","[CLASS:FNWND380;INSTANCE:1]")
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][2]
for $i=0 to ubound($Hsarr,1)-1
        if $HsArr[$i][1] ="Edit" then
           ;redim preserve $HsBrr[$n][1]
       $HsBrr[$n][0]=H$HsArr[$i][0]
           $HsBrr[$n][1]=$HsArr[$i][1]
           $n =$n+1
        EndIf
next
_ArrayDisplay($Hsbrr, '_WinAPI_EnumChildWindows')

最后是根据数组$HsBrr中的句柄和类名得到编辑框文本

for $i=0 to ubound($Hsbrr,1)-1
    $sText = ControlGetText($Hsbrr[$i][0], "", $Hsbrr[$i][1]);显示编辑控件的文本.
    ConsoleWrite($sText & @CRLF)
        $sText=""
next

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-3-16 21:42:46 | 显示全部楼层
新数组创建
Dim $n = 0
Dim $HsBrr[UBound($Hsarr)][2]
For $i = 0 To UBound($Hsarr) - 1
        If $HsArr[$i][1] = "Edit" Then
                ;redim preserve $HsBrr[$n][1]
                $HsBrr[$n][0] = $HsArr[$i][0]
                $HsBrr[$n][1] = $HsArr[$i][1]
                $n += 1
        EndIf
Next
If $n > 0 Then ReDim $HsBrr[$n][2]
_ArrayDisplay($HsBrr, '_WinAPI_EnumChildWindows')

评分

参与人数 1金钱 +10 收起 理由
cashiba + 10

查看全部评分

 楼主| 发表于 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未定义,怎么改呢?
 楼主| 发表于 2016-3-16 22:18:33 | 显示全部楼层
新数组创建
afan 发表于 2016-3-16 21:42
经测试成功,谢谢aFan版主费心!以前VB构造动态数组,需要preserve保留数据,而且只能改变第二维,第一维不能变。AU3中数组讲得都不多,也没见到动态、静态数组的说法。还得慢慢适应...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 02:42 , Processed in 0.093651 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表