cashiba 发表于 2016-3-13 12:38:54

请教API以及窗口操控函数的问题【已解决】

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

新手请教大神老师们:下面这段API自定义函数在AU3中有吗?没有的话怎么改变成AU3中可用的自定义函数呢?
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Func GetText(Arg_hwnd)
Dim S_TextLen
S_TextLen = SendMessage(Arg_hwnd, &HE, 0, 0)
S_strText = Space(S_TextLen)
Call SendMessage(Arg_hwnd, &HD, S_TextLen+1, S_strText)
GetText = S_strText
EndFunc

另外,下面这两个窗口函数在按键精灵中比较常用,可以层层递进得到子窗口或子控件的句柄
父句柄 = Plugin.Window.Find(窗口类名,窗口标题);根据窗口类名或标题返回窗口句柄
子句柄 = Plugin.Window.FindEx(父句柄, 0, 子类名, 0);根据父窗口句柄和子窗口(或控件)的类名得到子窗口或控件的句柄
在AU3中好像是分别对应于WinGetHandle及ControlGetHandle吧?
但直接改成AU3代码
#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiToolbar.au3>
#include <ScreenCapture.au3>
#include <GuiListView.au3>

Dim $biaoti,$H0,$H1,$H2
$biaoti="基本信息"
Opt("WinTitleMatchMode")
$H0= WinGetHandle($biaoti)
msgbox(0,"", $H0)
$H1 = ControlGetHandle($H0,"","MDIClient")
msgbox(0,"", $H1)
$H2 = ControlGetHandle($H1,"","FNWND380")
msgbox(0,"", $H2)

只有$H0能得到;$H1,$H2均为空.....这是怎么回事呢?

afan 发表于 2016-3-13 14:34:30

WinGetText
_WinAPI_GetParent
_WinAPI_EnumChildWindows

love008 发表于 2016-3-13 15:13:12

ControlGetHandle是au3经典语句,按键精灵查找子窗口方式比较痛苦。"MDIClient"处应该这样用:
1.ID方式: ""
2.Advance mode方式:""

cashiba 发表于 2016-3-13 16:41:09

本帖最后由 cashiba 于 2016-3-13 17:00 编辑

谢谢afan超版和love008老师哈,有些问题在按键里一直没找到解决办法,所以才试着学习AI。按键的语法接近VB,AI的语法不知道是哪个体系,一时还有点不适应....

对AI里的控件属性:

还没理解透切。
ID - 内部控件 ID. 是 windows 赋给每个控件的内部数字标识符. 通常是识别控件的最好方法. 除了 AutoIt 窗口信息工具之外, 其它应用程序如某些给盲人使用的读屏软件或者其它使用 Microsoft API 写的工具也可能会允许你获取控件 ID.
TEXT - 控件文本. 如按钮的文本: "下一步[&N]".
CLASS - 内部控件类名. 如:"Edit" 或 "Button"
CLASSNN - AutoIt 的早先版本中使用的 ClassnameNN 值 , 例如 "Edit1"
NAME - 内部 .NET 结构的 WinForms 名称(如果有)
REGEXPCLASS - 使用 正则表达式 的控件类名.
X \ Y \ W \ H - 控件的位置和大小.
INSTANCE - 当多个属性时, 按指定属性的序号匹配(序号基于 1 计算).
尤其是
1、控件ID,跟句柄有点分不清,不知道有没有什么函数或命令是返回ID的,像返回句柄一样?为啥控件属性里没有句柄这一概念呢?
2、另外一个就是INSTANCE,这个取值1、2...是根据什么来定的呢?
3、class跟classNN实际上是一样,跟所使用的AUTOIT的版本有关吧?

新手,见笑了哈{:face (239):}

cashiba 发表于 2016-3-13 16:52:50


有没有AUTOIT编写的像上图那样以ID(不是句柄)和类名构成的反映窗口和控件层次结构的窗口探测软件呢?

cashiba 发表于 2016-3-13 23:22:28

#include <Array.au3>
;#include <WinAPISys.au3>
Local $aData =_WinAPI_EnumChildWindows(66712)
_ArrayDisplay($aData, '_WinAPI_EnumChildWindows')

出现错误:
C:\Documents and Settings\Administrator\My Documents\GetCtrlinfo1.au3(35,45) : 错误: _WinAPI_EnumChildWindows(): 未定义的函数.
Local $aData =_WinAPI_EnumChildWindows(66712)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Administrator\My Documents\GetCtrlinfo1.au3 - 1 错误, 0 警告

cashiba 发表于 2016-3-13 23:24:32

#include <Array.au3>
#include <WinAPISys.au3>
Local $aData =_WinAPI_EnumChildWindows(66712)
_ArrayDisplay($aData, '_WinAPI_EnumChildWindows')

仍然出现错误:
G:\autoit3\Include\WinAPIInternals.au3(581,16) : 错误: 表达式错误 (非法字符)
        Return $bTest ?
        ~~~~~~~~~~~~~~^
G:\autoit3\Include\WinAPISys.au3(1143,48) : WARNING: $STR_STRIPLEADING: 使用前并未进行声明.
                If StringStripWS($sModule, $STR_STRIPLEADING +
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
G:\autoit3\Include\WinAPISys.au3(1143,68) : WARNING: $STR_STRIPTRAILING: 使用前并未进行声明.
                If StringStripWS($sModule, $STR_STRIPLEADING + $STR_STRIPTRAILING)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
G:\autoit3\Include\WinAPISys.au3(1143,48) : 错误: $STR_STRIPLEADING: 未声明的全局变量.
                If StringStripWS($sModule, $STR_STRIPLEADING +
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
G:\autoit3\Include\WinAPISys.au3(1143,68) : 错误: $STR_STRIPTRAILING: 未声明的全局变量.
                If StringStripWS($sModule, $STR_STRIPLEADING + $STR_STRIPTRAILING)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Administrator\My Documents\GetCtrlinfo1.au3 - 3 错误, 2 警告

cashiba 发表于 2016-3-13 23:25:32

这是咋回事?{:face (229):}

love008 发表于 2016-3-14 10:46:49

回复 8# cashiba

换3.3.14.2版试试.

love008 发表于 2016-3-14 10:53:34

回复 5# cashiba



当然有,如探测远程桌面连接的"连接"控件,可以获取这些值

love008 发表于 2016-3-14 11:07:57

回复 4# cashiba

1.窗口句柄用ControlGetHandle获取,控件句柄用ControlGetHandle获取.ID用AutoIt 窗口信息工具获取.
2.编写微软标准窗口时,会自动生成INSTANCE值,前面的语句为小值.
3.版本.

cashiba 发表于 2016-3-14 18:06:10

回复cashiba

换3.3.14.2版试试.
love008 发表于 2016-3-14 10:46 http://www.autoitx.com/images/common/back.gif今天换台电脑,没出现报错,版本跟昨天使用的不一样。确实是版本问题吧。觉得AU3前面include那么多函数有些不便,就做成一个函数库,统一自动索引多好,新手真是望而生畏阿{:face (340):}

cashiba 发表于 2016-3-14 18:13:28

回复cashiba

1.窗口句柄用ControlGetHandle获取,控件句柄用ControlGetHandle获取.ID用AutoIt 窗口信息 ...
love008 发表于 2016-3-14 11:07 http://www.autoitx.com/images/common/back.gif也就是说只能通过工具获得ID和instance,用函数或命令语句获取比较麻烦是吧?问题是有些子窗口里的控件无法用窗口信息工具精准定位,只能框个大窗口,无法框到里面的控件上。昨天好像看到AFan班长做的一个软件,比该工具定位要灵活些,只是还不大会用。以后再用用看{:face (271):}

love008 发表于 2016-3-14 21:55:35

回复 13# cashiba


    哈哈,多向afan 请教,不断提高!

cashiba 发表于 2016-3-15 06:52:46

afan版长的作品之一:
Au3.WProbe 窗口信息探测器
http://www.autoitx.com/forum.php?mod=viewthread&tid=17882&highlight=厉害啊{:face (88):}
页: [1] 2
查看完整版本: 请教API以及窗口操控函数的问题【已解决】