找回密码
 加入
搜索
查看: 4121|回复: 13

[AU3基础] 请问如何dllcall这段API代码使之能用于AU3[已解决]

  [复制链接]
发表于 2016-3-17 19:48:37 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2016-3-19 15:09 编辑
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中正常运行呢?
发表于 2016-3-17 22:12:24 | 显示全部楼层
这个 SendMessage Api 能获取的文本用 Au3 的内置函数都能获取,早跟你说过,干嘛不自己测试呢?
WinGetText、ControlGetText 等
 楼主| 发表于 2016-3-17 23:12:12 | 显示全部楼层
这个 SendMessage Api 能获取的文本用 Au3 的内置函数都能获取,早跟你说过,干嘛不自己测试呢?
WinGetTe ...
afan 发表于 2016-3-17 22:12
for $i=0 to ubound($Hsbrr,1)-1
    $sText = ControlGetText($Hsbrr[$i][0], "", $Hsbrr[$i][1]);显示编辑控件的文本.
    ConsoleWrite($sText & @CRLF)
        $sText=""
next
http://www.autoitx.com/thread-51776-1-1.html
请aFan超版看看这段代码哪里写得不对,为啥取不到值呢?在按键里引用sendmessage(如一楼类似形式的代码)能得到想要的结果
发表于 2016-3-17 23:36:59 | 显示全部楼层
ControlGetText($Hsbrr[$i][0], "", $Hsbrr[$i][1]);显示编辑控件的文本.
改为
ControlGetText("", "", $Hsbrr[$i][1]);显示编辑控件的文本.
试试
为何不用大家都能测试的目标程序做测试呢… 想不通~~  这样完全靠猜
 楼主| 发表于 2016-3-17 23:46:09 | 显示全部楼层
本帖最后由 cashiba 于 2016-3-17 23:47 编辑
ControlGetText("", "", $ ...
afan 发表于 2016-3-17 23:36
也试过了,取不到值阿。所以才想改用最直接的sendmessage来试试。就是下面这个
$S_strText = Space($S_TextLen)
DllCall("user32.dll","int","SendMessage","hwnd",$Arg_hwnd, "int",$WM_GETTEXT,"int",$S_TextLen+1,"int",$S_strText)

不知道怎么修改。au3里好像没有space函数....
发表于 2016-3-18 11:25:56 | 显示全部楼层
Run("notepad.exe")
Local $var = ControlGetText("[CLASS:Notepad]", "", "Edit1")
WinWaitActive("[CLASS:Notepad]","")
ControlCommand("[CLASS:Notepad]", "", "Edit1", "EditPaste", "是要获得这里的内容吗")

$Arg_hwnd = ControlGetHandle("[CLASS:Notepad]", "", "[CLASS:Edit; INSTANCE:1]")
MsgBox(4096, "测试", GetText($Arg_hwnd))
Func GetText($Arg_hwnd)
        Const $WM_GETTEXT = 0xD
        Const $WM_GETTEXTLENGTH = 0xE
        Dim $S_TextLen, $S_strText
        $S_TextLen = _SendMessage($Arg_hwnd, $WM_GETTEXTLENGTH, 0, 0)
        $S_strText = Space($S_TextLen)
        $txt = _SendMessage($Arg_hwnd, $WM_GETTEXT, $S_TextLen + 1, DllStructGetPtr($S_strText))
        Return DllStructGetData($S_strText, "var")
EndFunc   ;==>GetText
Func Space($S_TextLen)
        Local $a = DllStructCreate("char var[" & $S_TextLen & "]") ;创建一个结构,分配内存空间
        Return $a;
EndFunc   ;==>Space

Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
        Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageA", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
        If @error Then Return SetError(@error, @extended, "")
        If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
        Return $aResult
EndFunc   ;==>_SendMessage

评分

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

查看全部评分

 楼主| 发表于 2016-3-18 19:21:16 | 显示全部楼层
本帖最后由 cashiba 于 2016-3-18 19:32 编辑
zldfsz 发表于 2016-3-18 11:25
谢谢zldfsz老师!我还以为调用API只能用dllcall呢。
测试汇报:
1、 Const $WM_GETTEXT = 0xD
       Const $WM_GETTEXTLENGTH = 0xE
       _SendMessage
       在#include <.....>中均有原型已预定义,注释后不再报错。
2、窗口spy所见如右:
     请看第一个句柄66666处有值。
3、代码测试结果如右:
不知道为啥会有不同,是不是还要字符转码啥的呢。感觉已经很接近了

本帖子中包含更多资源

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

×
发表于 2016-3-19 10:32:46 | 显示全部楼层
6# 获取的和直接 ControlGetText() 是一样的。
把第7行改一下比较结果
MsgBox(4096, ControlGetText("[CLASS:Notepad]", "", "Edit1"), GetText($Arg_hwnd))
楼主继续折腾。
 楼主| 发表于 2016-3-19 15:00:50 | 显示全部楼层
这个真不是折腾,如果都是记事本、计算器那样的标准控件,采取哪种方法可能都能行,但是这次采取六楼的写法还真取到值了,也就是只通过句柄就得到值。用control get text就是得不到结果。咱是新手,这些AU3的函数咱是不明觉厉,也许是太高深了,不会用吧。不管怎么讲,达到目的,得到结果才是王道吧.
 楼主| 发表于 2016-3-19 15:08:09 | 显示全部楼层
顺便说一句,六楼得到的结果跟大多数窗口spy工具能得到的结果是一致的,也许最多只能达到这个地步了。就算解决问题了,再往下走就太难为人了,真变成折腾了吧?
发表于 2016-3-19 15:14:04 | 显示全部楼层
这个真不是折腾,如果都是记事本、计算器那样的标准控件,采取哪种方法可能都能行,但是这次采取六楼的写法 ...
cashiba 发表于 2016-3-19 15:00



    你要的本来就是标准的edit控件,如果内置取不到你这种方法也取不到。当然,首先你得拿对了句炳。不说了
 楼主| 发表于 2016-3-19 22:22:54 | 显示全部楼层
对API几乎没啥了解,所以不懂为什么,那段代码也是在网上搜了好久看到的,在按键里已经验证可行,到Auotoitx里来,也是想看看有没有更有效的函数,试过 Controlgettext
怎么折腾都取不到,也许不会用它吧。
试过各种spy工具,但是奇怪的是,同为edit编辑框,少数能取到值,大多数取不到。不知道AU3有没有spy++这样的树状层次结构显示窗口和控件的工具,易语言写的倒有好几个。不管怎么说,这段代码简捷直观有用是真的.....。问题算是解决了吧,再次 谢谢各位老师咯
发表于 2016-3-19 22:47:47 | 显示全部楼层
回复 12# cashiba

就像你说的,窗口控件的层次结构并非一致的,有的可能很深,探测工具可能探测到的并非是你想要的,所以还得你自己探测其结构,找到需要的真实句炳一般就解决了。如果是非win标准控件,自绘的之类的,那获取就不容易了,需要读内存、ocr识别、找图识别之类的,相对来说,那就比较麻烦了
发表于 2016-3-23 10:20:48 | 显示全部楼层
_WinAPI_SendMessage
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 20:41 , Processed in 0.126662 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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