cashiba 发表于 2016-3-17 19:48:37

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

本帖最后由 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中正常运行呢?

afan 发表于 2016-3-17 22:12:24

这个 SendMessage Api 能获取的文本用 Au3 的内置函数都能获取,早跟你说过,干嘛不自己测试呢?
WinGetText、ControlGetText 等

cashiba 发表于 2016-3-17 23:12:12

这个 SendMessage Api 能获取的文本用 Au3 的内置函数都能获取,早跟你说过,干嘛不自己测试呢?
WinGetTe ...
afan 发表于 2016-3-17 22:12 http://www.autoitx.com/images/common/back.gif

for $i=0 to ubound($Hsbrr,1)-1
    $sText = ControlGetText($Hsbrr[$i], "", $Hsbrr[$i]);显示编辑控件的文本.
    ConsoleWrite($sText & @CRLF)
      $sText=""
next
http://www.autoitx.com/thread-51776-1-1.html请aFan超版看看这段代码哪里写得不对,为啥取不到值呢?在按键里引用sendmessage(如一楼类似形式的代码)能得到想要的结果

afan 发表于 2016-3-17 23:36:59

ControlGetText($Hsbrr[$i], "", $Hsbrr[$i]);显示编辑控件的文本.
改为
ControlGetText("", "", $Hsbrr[$i]);显示编辑控件的文本.
试试
为何不用大家都能测试的目标程序做测试呢… 想不通~~这样完全靠猜

cashiba 发表于 2016-3-17 23:46:09

本帖最后由 cashiba 于 2016-3-17 23:47 编辑

ControlGetText("", "", $ ...
afan 发表于 2016-3-17 23:36 http://www.autoitx.com/images/common/back.gif也试过了,取不到值阿。所以才想改用最直接的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函数....

zldfsz 发表于 2016-3-18 11:25:56

Run("notepad.exe")
Local $var = ControlGetText("", "", "Edit1")
WinWaitActive("","")
ControlCommand("", "", "Edit1", "EditPaste", "是要获得这里的内容吗")

$Arg_hwnd = ControlGetHandle("", "", "")
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

cashiba 发表于 2016-3-18 19:21:16

本帖最后由 cashiba 于 2016-3-18 19:32 编辑

zldfsz 发表于 2016-3-18 11:25 http://www.autoitx.com/images/common/back.gif谢谢zldfsz老师!我还以为调用API只能用dllcall呢。测试汇报:
1、 Const $WM_GETTEXT = 0xD
       Const $WM_GETTEXTLENGTH = 0xE
       _SendMessage
       在#include <.....>中均有原型已预定义,注释后不再报错。
2、窗口spy所见如右:
   请看第一个句柄66666处有值。
3、代码测试结果如右: 不知道为啥会有不同,是不是还要字符转码啥的呢。感觉已经很接近了

afan 发表于 2016-3-19 10:32:46

6# 获取的和直接 ControlGetText() 是一样的。
把第7行改一下比较结果
MsgBox(4096, ControlGetText("", "", "Edit1"), GetText($Arg_hwnd))
楼主继续折腾。

cashiba 发表于 2016-3-19 15:00:50

这个真不是折腾,如果都是记事本、计算器那样的标准控件,采取哪种方法可能都能行,但是这次采取六楼的写法还真取到值了,也就是只通过句柄就得到值。用control get text就是得不到结果。咱是新手,这些AU3的函数咱是不明觉厉,也许是太高深了,不会用吧。不管怎么讲,达到目的,得到结果才是王道吧.

cashiba 发表于 2016-3-19 15:08:09

顺便说一句,六楼得到的结果跟大多数窗口spy工具能得到的结果是一致的,也许最多只能达到这个地步了。就算解决问题了,再往下走就太难为人了,真变成折腾了吧?

afan 发表于 2016-3-19 15:14:04

这个真不是折腾,如果都是记事本、计算器那样的标准控件,采取哪种方法可能都能行,但是这次采取六楼的写法 ...
cashiba 发表于 2016-3-19 15:00 http://autoitx.com/images/common/back.gif


    你要的本来就是标准的edit控件,如果内置取不到你这种方法也取不到。当然,首先你得拿对了句炳。不说了

cashiba 发表于 2016-3-19 22:22:54

对API几乎没啥了解,所以不懂为什么,那段代码也是在网上搜了好久看到的,在按键里已经验证可行,到Auotoitx里来,也是想看看有没有更有效的函数,试过 Controlgettext
怎么折腾都取不到,也许不会用它吧。
试过各种spy工具,但是奇怪的是,同为edit编辑框,少数能取到值,大多数取不到。不知道AU3有没有spy++这样的树状层次结构显示窗口和控件的工具,易语言写的倒有好几个。不管怎么说,这段代码简捷直观有用是真的.....。问题算是解决了吧,再次 谢谢各位老师咯

afan 发表于 2016-3-19 22:47:47

回复 12# cashiba

就像你说的,窗口控件的层次结构并非一致的,有的可能很深,探测工具可能探测到的并非是你想要的,所以还得你自己探测其结构,找到需要的真实句炳一般就解决了。如果是非win标准控件,自绘的之类的,那获取就不容易了,需要读内存、ocr识别、找图识别之类的,相对来说,那就比较麻烦了

justlovemm 发表于 2016-3-23 10:20:48

_WinAPI_SendMessage
页: [1]
查看完整版本: 请问如何dllcall这段API代码使之能用于AU3[已解决]