找回密码
 加入
搜索
查看: 4647|回复: 17

[AU3基础] 关于窗口的等待判断的一个问题,请帮忙一下,谢谢【已解决】

[复制链接]
发表于 2021-5-29 20:48:36 | 显示全部楼层 |阅读模式
本帖最后由 ttmv2019sx 于 2021-5-30 19:32 编辑

是这样的,现在有一个程序是标准控件的,窗口信息也可以获得,但是里面的文字部分,只有Button1按钮上有文字,并且,这个程序一部一部执行下去,这个Button1都是一样的没有变化,所以文本部分没有办法有效的判断,只有里面的每一个页的控件的类名是不一样的,顺序也不一样,但是又碰到一个问题是,这个他有一个执行过程,有快有慢,所以就碰到了问题,在只有窗口信息名字的情况下,如果立即出现控件的话,哪我就可以继续下一步应该点击的操作,如果不出现控件,就无法进行选择,主要是程序在运行中,会有几种不同的执行操作,所以现在没有办法有效的来判断了,

不知道有没有讲明白,这个讲讲确实不太好说明白,,忘理解。


Local $hwnd=winwait('Uninstall Microsoft Office','',10)
If ControlGetHandle($hwnd,'','[CLASS:DirectUIHWND; INSTANCE:2]') Then



窗口信息只有一个标题叫Uninstall Microsoft Office里面一共是有好几个步骤的,如果有唯一的可见文本就方法了,没有唯一的可见文本,所以只能是得到窗体中的控件的出现来判断了,但是这个窗体有扫描功能的,有快有慢,就是这个窗体中的控件的判断不太好撑握,如果是循环的话是可以,但是时间上太浪费了,不知道有没有什么好的办法


A大,各位大神,有什么好办法的吗,
发表于 2021-5-29 22:23:50 | 显示全部楼层
不太明白你的意思…… 可能贴出你的代码更容易理解
 楼主| 发表于 2021-5-30 11:53:52 | 显示全部楼层
afan 发表于 2021-5-29 22:23
不太明白你的意思…… 可能贴出你的代码更容易理解

昨天,初步的写的,,

Local $hwnd=winwait('Uninstall Microsoft Office','',10)
If ControlGetHandle($hwnd,'','[CLASS:DirectUIHWND; INSTANCE:2]') Then

msgbox(64,'警告','找到',3)
ControlClick('Uninstall Microsoft Office','','Button1')

Else
        msgbox(64,'警告','没有')
EndIf


If winwait('Uninstall Microsoft Office','Yes, remove all Office installations',50) Then

msgbox(64,'警告','找到',3)
ControlClick('Uninstall Microsoft Office','Yes, remove all Office installations','Button6')


Else
        msgbox(64,'警告','没有')
EndIf



Local $hwnd=winwait('Uninstall Microsoft Office','',100)
If ControlGetHandle($hwnd,'','[CLASS:DirectUIHWND; INSTANCE:5]') Then

msgbox(64,'警告','找到',3)
ControlClick('Uninstall Microsoft Office','','Button1')

Else
        msgbox(64,'警告','没有')
EndIf



If winwait('Uninstall Microsoft Office','关闭疑难解答',50) Then

msgbox(64,'警告','找到',3)
ControlClick('Uninstall Microsoft Office','关闭疑难解答','Button3')


Else
        msgbox(64,'警告','没有')
EndIf



A大,主要是这个样子的,
如果窗口信息中没有可见文本内容的话,除去按钮上的文本以外,通过控件的类别名与接口数,来判断这个窗口的唯 一标识,   但是主要是这个控件显示出来和窗口信息标题不同步,要扫描完成才显示,所以这个时间上不太好撑握,

上面有标题与文本的,这个好操作,而只有标题的,没有文本的,只能是通过控件来判断,因为窗体中的按钮都是Button1与Button3  文字与是一样的,但是要操作的时候选择是不一样的,所以,,,,











发表于 2021-5-30 14:11:21 | 显示全部楼层
其实是想写一个office卸载工具的自动点击的脚本对吧
发表于 2021-5-30 14:16:45 | 显示全部楼层
ttmv2019sx 发表于 2021-5-30 11:53
昨天,初步的写的,,

Local $hwnd=winwait('Uninstall Microsoft Office','',10)

试试
Local $sTitle = 'Uninstall Microsoft Office'
Local $aControl[3][3] = [[2], [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]

WinWait($sTitle, '', 10)
Local $ix = _ControlWait($aControl, 50) ; 等待某个控件出现,可设置超时
If @error Then
        MsgBox(48, '警告', '没有: DirectUIHWND')
Else
        ControlClick($sTitle, '', 'Button1')
EndIf

If WinWait($sTitle, 'Yes, remove all Office installations', 50) Then
        ControlClick($sTitle, '', 'Button6')
Else
        MsgBox(48, '警告', '没有: Yes, remove...')
EndIf

$ix = _ControlWait($aControl, 50) ; 等待某个控件出现,可设置超时
If @error Then
        MsgBox(48, '警告', '没有: DirectUIHWND')
Else
        ControlClick($sTitle, '', 'Button1')
EndIf

If WinWait($sTitle, '关闭疑难解答', 50) Then
        ControlClick($sTitle, '', 'Button3')
Else
        MsgBox(48, '警告', '没有: 关闭疑难解答')
EndIf

Func _ControlWait($aControl, $iTimeout = 0) ; 等待某个控件出现,可设置超时
;~         $aControl - 控件数组: [0][0] 需匹配的数量;[1~n][0]第n控件的标题; [1~n][1]第n控件的文本; [1~n][2]第n控件的控件ID;
;~         $iTimeout - 超时秒,为0始终等待
;~         返回值: 成功 - 若某控件已出现,返回该控件在数组中的1基索引;失败 - 所有控件在超时范围内未出现则返回0,并设置 @error=1
        Local $ts = TimerInit()
        Do
                For $ii = 1 To $aControl[0][0]
                        If ControlGetHandle($aControl[$ii][0], $aControl[$ii][1], $aControl[$ii][2]) Then Return $ii
                Next
                Sleep(50)
                If $iTimeout And TimerDiff($ts) >= $iTimeout * 1000 Then Return SetError(1, 0, 0)
        Until 0
EndFunc   ;==>_ControlWait
 楼主| 发表于 2021-5-30 16:04:33 | 显示全部楼层
zhaoceshi 发表于 2021-5-30 14:11
其实是想写一个office卸载工具的自动点击的脚本对吧

是的。现在碰到了一个小问题呵呵,所以来这里请教大家来了
 楼主| 发表于 2021-5-30 16:07:37 | 显示全部楼层

好的,A大,,我试试,,我早上是用的最笨的方法,来操作的,就是一个循环的方法,这样就是一个过程还在扫描的时候,就不会因为无法有效的去判断控件是否出现而中断

代码如下

Local $i = 0
Do

        Local $hwnd=winwait('Uninstall Microsoft Office','',3)

   If ControlGetHandle($hwnd,'','[CLASS:DirectUIHWND; INSTANCE:4]') Then



msgbox(64,'警告','找到窗体,发现office程序存在',3)
WinActivate('Uninstall Microsoft Office')
ControlClick($hwnd,'','Button6')
Local $a=1
ExitLoop


   elseIf ControlGetHandle($hwnd,'','[CLASS:RICHEDIT50W; INSTANCE:1]') Then




msgbox(64,'警告','找到窗体,没有发现office程序',3)
WinActivate('Uninstall Microsoft Office')
ControlClick($hwnd,'','Button6')
Local $a=2
ExitLoop

Else

If $i=60 then


        Local $a=3
        ExitLoop
EndIf

EndIf


    $i = $i + 1
        Sleep(5000)


Until $i = 60

 楼主| 发表于 2021-5-30 16:11:43 | 显示全部楼层
本帖最后由 ttmv2019sx 于 2021-5-30 16:47 编辑

你好,A版,还有一个问题,请教一下,A窗体信息的标题是'你好'  文字是'123‘    而,B窗体的信息标题是'你好'  文字是'123456'  请问,这个要如何判断,我发现只有窗体的标题是可以完全匹配,而文字没有这 个功能的吗?没有找到这个命令,

标题是可以用,Opt("WinTitleMatchMode", 3)  ,但是文字不知道用什么来判断,因为像上面这样的话,两个不同的窗体被找到后,都会以A这个窗体下的命令继续走下去,而不是安需来走,
WinTextMatchMode  是可以完全匹配,但是也是一个包含操作,,哎,不知道怎么办


最终还是用的是ControlGetText($hwnd,'','Button6')  这个方法来判断,,,就是不知道,是否有更有效的办法,
发表于 2021-5-30 16:49:59 | 显示全部楼层
本帖最后由 afan 于 2021-5-30 16:51 编辑
ttmv2019sx 发表于 2021-5-30 16:11
你好,A版,还有一个问题,请教一下,A窗体信息的标题是'你好'  文字是'123‘    而,B窗体的信息标题是' ...

先检测 '456',没有的话再检测 '123'。这算什么问题……
 楼主| 发表于 2021-5-30 19:30:24 | 显示全部楼层
本帖最后由 ttmv2019sx 于 2021-5-30 19:31 编辑
afan 发表于 2021-5-30 16:49
先检测 '456',没有的话再检测 '123'。这算什么问题……

是的,A大你说的没有错,原理是你说的哪么简音,但是WinWait("标题"[, "文本"[, 超时 = 0]])
这个命令,好像文本这一块没有直接可以达到你说的这个操作的吧,,还是要用到ControlGetText($hwnd,'','Button6')   得到这个控件的文本,再来判断的吧。
如果方便的话,A版再指点一下,谢谢
发表于 2021-5-30 19:41:04 | 显示全部楼层
ttmv2019sx 发表于 2021-5-30 19:30
是的,A大你说的没有错,原理是你说的哪么简音,但是WinWait("标题"[, "文本"[, 超时 = 0]])
这个命令, ...

当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的代码也没见你反馈结果。
 楼主| 发表于 2021-5-30 20:09:21 | 显示全部楼层
afan 发表于 2021-5-30 19:41
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的 ...

上面的代码,,我在整合中测试,等结果了和你说,,谢谢你
 楼主| 发表于 2021-5-30 20:26:10 | 显示全部楼层
afan 发表于 2021-5-30 19:41
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的 ...

A大,测试如下,在
$ix = _ControlWait($aControl, 50) ; 等待某个控件出现,可设置超时
If @error Then
        MsgBox(48, '警告', '没有: DirectUIHWND')
Else
        ControlClick($sTitle, '', 'Button1')
EndIf
这个无法再继续判断,而直接到了,下面的这一段了

If WinWait($sTitle, '关闭疑难解答', 50) Then
        ControlClick($sTitle, '', 'Button3')
Else
        MsgBox(48, '警告', '没有: 关闭疑难解答')
EndIf


$ix = _ControlWait($aControl, 50) ;而这一段的窗体中的控件是DirectUIHWND1   DirectUIHWND5

Local $aControl[3][3] = [[2], [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]  这一段有一些不太理解,

发表于 2021-5-30 20:39:40 | 显示全部楼层
本帖最后由 afan 于 2021-5-30 20:41 编辑
ttmv2019sx 发表于 2021-5-30 20:26
A大,测试如下,在
$ix = _ControlWait($aControl, 50) ; 等待某个控件出现,可设置超时
If @error The ...
这个无法再继续判断,而直接到了,下面的这一段了

完全不懂你说什么

Local $aControl[3][3] = [[2], [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]  这一段有一些不太理解,

在函数定义里解释过了
Func _ControlWait($aControl, $iTimeout = 0) ; 等待某个控件出现,可设置超时
;~         $aControl - 控件数组: [0][0] 需匹配的数量;[1~n][0]第n控件的标题; [1~n][1]第n控件的文本; [1~n][2]第n控件的控件ID;

意思是只要 DirectUIHWND2 或  DirectUIHWND5 出现任意一个就返回。因为你在1#说的“只有里面的每一个页的控件的类名是不一样的,顺序也不一样”,我理解为这里可能是DirectUIHWND2 出现,也可能是 DirectUIHWND5 出现。
如果你只需等待 DirectUIHWND2 ,那可以写成:
Local $aControl[2][3] = [[1], [$sTitle, '', 'DirectUIHWND2']]

发表于 2021-5-30 21:03:48 | 显示全部楼层
现在脑子不够用啊,完全没看懂楼主的问题。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 21:29 , Processed in 0.078858 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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