关于窗口的等待判断的一个问题,请帮忙一下,谢谢【已解决】
本帖最后由 ttmv2019sx 于 2021-5-30 19:32 编辑是这样的,现在有一个程序是标准控件的,窗口信息也可以获得,但是里面的文字部分,只有Button1按钮上有文字,并且,这个程序一部一部执行下去,这个Button1都是一样的没有变化,所以文本部分没有办法有效的判断,只有里面的每一个页的控件的类名是不一样的,顺序也不一样,但是又碰到一个问题是,这个他有一个执行过程,有快有慢,所以就碰到了问题,在只有窗口信息名字的情况下,如果立即出现控件的话,哪我就可以继续下一步应该点击的操作,如果不出现控件,就无法进行选择,主要是程序在运行中,会有几种不同的执行操作,所以现在没有办法有效的来判断了,
不知道有没有讲明白,这个讲讲确实不太好说明白,,忘理解。
Local $hwnd=winwait('Uninstall Microsoft Office','',10)
If ControlGetHandle($hwnd,'','') Then
窗口信息只有一个标题叫Uninstall Microsoft Office里面一共是有好几个步骤的,如果有唯一的可见文本就方法了,没有唯一的可见文本,所以只能是得到窗体中的控件的出现来判断了,但是这个窗体有扫描功能的,有快有慢,就是这个窗体中的控件的判断不太好撑握,如果是循环的话是可以,但是时间上太浪费了,不知道有没有什么好的办法
A大,各位大神,有什么好办法的吗,
不太明白你的意思…… 可能贴出你的代码更容易理解 afan 发表于 2021-5-29 22:23
不太明白你的意思…… 可能贴出你的代码更容易理解
昨天,初步的写的,,
Local $hwnd=winwait('Uninstall Microsoft Office','',10)
If ControlGetHandle($hwnd,'','') 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,'','') 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文字与是一样的,但是要操作的时候选择是不一样的,所以,,,,
其实是想写一个office卸载工具的自动点击的脚本对吧 ttmv2019sx 发表于 2021-5-30 11:53
昨天,初步的写的,,
Local $hwnd=winwait('Uninstall Microsoft Office','',10)
试试
Local $sTitle = 'Uninstall Microsoft Office'
Local $aControl = [, [$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 - 控件数组: 需匹配的数量;第n控件的标题; 第n控件的文本; 第n控件的控件ID;
;~ $iTimeout - 超时秒,为0始终等待
;~ 返回值: 成功 - 若某控件已出现,返回该控件在数组中的1基索引;失败 - 所有控件在超时范围内未出现则返回0,并设置 @error=1
Local $ts = TimerInit()
Do
For $ii = 1 To $aControl
If ControlGetHandle($aControl[$ii], $aControl[$ii], $aControl[$ii]) Then Return $ii
Next
Sleep(50)
If $iTimeout And TimerDiff($ts) >= $iTimeout * 1000 Then Return SetError(1, 0, 0)
Until 0
EndFunc ;==>_ControlWait zhaoceshi 发表于 2021-5-30 14:11
其实是想写一个office卸载工具的自动点击的脚本对吧
是的。现在碰到了一个小问题呵呵,所以来这里请教大家来了 afan 发表于 2021-5-30 14:16
试试
好的,A大,,我试试,,我早上是用的最笨的方法,来操作的,就是一个循环的方法,这样就是一个过程还在扫描的时候,就不会因为无法有效的去判断控件是否出现而中断
代码如下
Local $i = 0
Do
Local $hwnd=winwait('Uninstall Microsoft Office','',3)
If ControlGetHandle($hwnd,'','') Then
msgbox(64,'警告','找到窗体,发现office程序存在',3)
WinActivate('Uninstall Microsoft Office')
ControlClick($hwnd,'','Button6')
Local $a=1
ExitLoop
elseIf ControlGetHandle($hwnd,'','') 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
本帖最后由 ttmv2019sx 于 2021-5-30 16:47 编辑
afan 发表于 2021-5-30 14:16
试试
你好,A版,还有一个问题,请教一下,A窗体信息的标题是'你好'文字是'123‘ 而,B窗体的信息标题是'你好'文字是'123456'请问,这个要如何判断,我发现只有窗体的标题是可以完全匹配,而文字没有这 个功能的吗?没有找到这个命令,
标题是可以用,Opt("WinTitleMatchMode", 3),但是文字不知道用什么来判断,因为像上面这样的话,两个不同的窗体被找到后,都会以A这个窗体下的命令继续走下去,而不是安需来走,
WinTextMatchMode是可以完全匹配,但是也是一个包含操作,,哎,不知道怎么办
最终还是用的是ControlGetText($hwnd,'','Button6')这个方法来判断,,,就是不知道,是否有更有效的办法,
本帖最后由 afan 于 2021-5-30 16:51 编辑
ttmv2019sx 发表于 2021-5-30 16:11
你好,A版,还有一个问题,请教一下,A窗体信息的标题是'你好'文字是'123‘ 而,B窗体的信息标题是' ...
先检测 '456',没有的话再检测 '123'。这算什么问题…… 本帖最后由 ttmv2019sx 于 2021-5-30 19:31 编辑
afan 发表于 2021-5-30 16:49
先检测 '456',没有的话再检测 '123'。这算什么问题……
是的,A大你说的没有错,原理是你说的哪么简音,但是WinWait("标题"[, "文本"[, 超时 = 0]])
这个命令,好像文本这一块没有直接可以达到你说的这个操作的吧,,还是要用到ControlGetText($hwnd,'','Button6') 得到这个控件的文本,再来判断的吧。
如果方便的话,A版再指点一下,谢谢
ttmv2019sx 发表于 2021-5-30 19:30
是的,A大你说的没有错,原理是你说的哪么简音,但是WinWait("标题"[, "文本"[, 超时 = 0]])
这个命令, ...
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的代码也没见你反馈结果。 afan 发表于 2021-5-30 19:41
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的 ...
上面的代码,,我在整合中测试,等结果了和你说,,谢谢你 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 = [, [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]这一段有一些不太理解,
本帖最后由 afan 于 2021-5-30 20:41 编辑
ttmv2019sx 发表于 2021-5-30 20:26
A大,测试如下,在
$ix = _ControlWait($aControl, 50) ; 等待某个控件出现,可设置超时
If @error The ...
这个无法再继续判断,而直接到了,下面的这一段了
完全不懂你说什么
Local $aControl = [, [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]这一段有一些不太理解,
在函数定义里解释过了
Func _ControlWait($aControl, $iTimeout = 0) ; 等待某个控件出现,可设置超时
;~ $aControl - 控件数组: 需匹配的数量;第n控件的标题; 第n控件的文本; 第n控件的控件ID;
意思是只要 DirectUIHWND2 或DirectUIHWND5 出现任意一个就返回。因为你在1#说的“只有里面的每一个页的控件的类名是不一样的,顺序也不一样”,我理解为这里可能是DirectUIHWND2 出现,也可能是 DirectUIHWND5 出现。
如果你只需等待 DirectUIHWND2 ,那可以写成:
Local $aControl = [, [$sTitle, '', 'DirectUIHWND2']]
现在脑子不够用啊,完全没看懂楼主的问题。
页:
[1]
2