ttmv2019sx 发表于 2021-5-29 20:48:36

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

本帖最后由 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:50

不太明白你的意思…… 可能贴出你的代码更容易理解

ttmv2019sx 发表于 2021-5-30 11:53:52

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文字与是一样的,但是要操作的时候选择是不一样的,所以,,,,











zhaoceshi 发表于 2021-5-30 14:11:21

其实是想写一个office卸载工具的自动点击的脚本对吧

afan 发表于 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 = [, [$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

ttmv2019sx 发表于 2021-5-30 16:04:33

zhaoceshi 发表于 2021-5-30 14:11
其实是想写一个office卸载工具的自动点击的脚本对吧

是的。现在碰到了一个小问题呵呵,所以来这里请教大家来了

ttmv2019sx 发表于 2021-5-30 16:07:37

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:11:43

本帖最后由 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:49:59

本帖最后由 afan 于 2021-5-30 16:51 编辑

ttmv2019sx 发表于 2021-5-30 16:11
你好,A版,还有一个问题,请教一下,A窗体信息的标题是'你好'文字是'123‘    而,B窗体的信息标题是' ...
先检测 '456',没有的话再检测 '123'。这算什么问题……

ttmv2019sx 发表于 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版再指点一下,谢谢

afan 发表于 2021-5-30 19:41:04

ttmv2019sx 发表于 2021-5-30 19:30
是的,A大你说的没有错,原理是你说的哪么简音,但是WinWait("标题"[, "文本"[, 超时 = 0]])
这个命令, ...
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的代码也没见你反馈结果。

ttmv2019sx 发表于 2021-5-30 20:09:21

afan 发表于 2021-5-30 19:41
当然不要用 WinWait ,用 WinExists ,如我上面给你写的 _ControlWait 逻辑,这里我就不给你写了,上面的 ...

上面的代码,,我在整合中测试,等结果了和你说,,谢谢你

ttmv2019sx 发表于 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 = [, [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]这一段有一些不太理解,

afan 发表于 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 = [, [$sTitle, '', 'DirectUIHWND2'], [$sTitle, '', 'DirectUIHWND5']]这一段有一些不太理解,
在函数定义里解释过了
Func _ControlWait($aControl, $iTimeout = 0) ; 等待某个控件出现,可设置超时
;~         $aControl - 控件数组: 需匹配的数量;第n控件的标题; 第n控件的文本; 第n控件的控件ID;

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

haijie1223 发表于 2021-5-30 21:03:48

现在脑子不够用啊,完全没看懂楼主的问题。
页: [1] 2
查看完整版本: 关于窗口的等待判断的一个问题,请帮忙一下,谢谢【已解决】