找回密码
 加入
搜索
查看: 8478|回复: 57

[网络通信] 关于等窗口获取失败的情况!【已解决】

[复制链接]
发表于 2021-8-4 21:14:28 | 显示全部楼层 |阅读模式
本帖最后由 ttmv2019sx 于 2021-8-24 10:46 编辑

A版,,请问一下,
winwait('Uninstall Microsoft Office','下一步(&N)',500)
这个命令,为什么在WIN7旗见,专业,WIN10企业版中基本上都是可以获取成功。正常下去
但是在WIN10家庭版中,失败率很高,10次中有3次没有找到这个窗口
系统都是纯净的系统,没有多于的软件,请问一下,为什么只有Uninstall Microsoft Office这个名字的
窗口标题在运行的,没有其它软件在运行,也会获取失败呢,真不知道是什么引起的。
发表于 2021-8-4 21:18:07 | 显示全部楼层
WinWait("'Uninstall Microsoft Office", "", 500)试下
 楼主| 发表于 2021-8-5 08:29:07 | 显示全部楼层
smallan 发表于 2021-8-4 21:18
WinWait("'Uninstall Microsoft Office", "", 500)试下

哦,,好的,,这个我去试一下,,不过有一个问题,想请问一下,如果工具,各个不同的页面之间要来判断点击什么按钮,我是根据这个文字来判断的,如果文字中有A  我就点A按钮,,如果是B,哪就点B按钮,如果你的这个文字取消了,这个要怎么判断,,是否是用控件上的文本来判断呢,?
 楼主| 发表于 2021-8-5 08:32:09 | 显示全部楼层
smallan 发表于 2021-8-4 21:18
WinWait("'Uninstall Microsoft Office", "", 500)试下

奇怪的,是WIN10的系统,只要是全新安装的,都是100%成功的,,唯 独,使用过一段时间后的电脑,会产生这个现象,哎,,而且,也会有几次成功的,,这个就是无法解释了。论坛里的风大,说是吧,下一步(&N)  这几个字改成‘下一步’   然后这个去试效果是一样的,,也是时灵时不灵,
发表于 2021-8-5 08:39:31 | 显示全部楼层
等待窗口文本参数可以不写,也可以用类名来代替标题或者一起用更加准确识别,以前也试过这种情况 winwait是会阻断线程的,也可以改用WinExists来检测
 楼主| 发表于 2021-8-5 08:48:11 | 显示全部楼层
风行者 发表于 2021-8-5 08:39
等待窗口文本参数可以不写,也可以用类名来代替标题或者一起用更加准确识别,以前也试过这种情况 winwait是 ...

哦,风大,上次你也和我说过的。我文字  下一步(&N)   光是下一步,也是没有什么好的效果,,也是时好时坏,但是我全新安装的电脑的系统上,,次次,都是成功的,没有不成功的现象,还有,类名与标题我也试着,全加了,但是文本我还是保留的,,结果效果也是一样,我现在听你们的取消文本去试试,电脑有可能是发视经了,呵呵,,,,,,,,,,,,,,但是就如我上面请教的问题一样,就是文本取消了,我要如何去判断下一步窗口内的操作呢,本来只有有文本出来A了,,哪我就去操作A的路线走下去,,如果文本出来是B,我就走B的路径,,现在文本不用了,哪怎么去判断A路线与B路线呢?
 楼主| 发表于 2021-8-5 08:51:20 | 显示全部楼层
风行者 发表于 2021-8-5 08:39
等待窗口文本参数可以不写,也可以用类名来代替标题或者一起用更加准确识别,以前也试过这种情况 winwait是 ...

而且,如果是光是标题与类名的话,,是不是直接用句柄更准确的,,比如说,获取进行的PID,然后转成句柄,然后再来判断窗口使用,,,,,,,,,现在不管是用句柄,还是类名与标题组合,,,,就是碰到了,要如何判断下一步的操作,,,,本来有文本的话,我都是判断到了这个文本的内容,就操作什么,现在文本没有了,就一头晕了,,小菜鸟,忘风大解一下,,谢谢
 楼主| 发表于 2021-8-5 08:52:32 | 显示全部楼层
风行者 发表于 2021-8-5 08:39
等待窗口文本参数可以不写,也可以用类名来代替标题或者一起用更加准确识别,以前也试过这种情况 winwait是 ...

哦,对了,风大,,你在你的网页,还有在论坛里,有一个清理IE缓存的代码发布过,使用了后,,是隐藏清理的,但是有一个现象好像是不会清理,在IE中设置的兼容性列表的,不知道这个你有没有关注过
发表于 2021-8-5 10:53:58 | 显示全部楼层
本帖最后由 风行者 于 2021-8-5 11:12 编辑

最好控件用类名代替文本,用窗口工具查就知道
_WinWait('Uninstall Microsoft Office', '下一步(&N)',5)

Func _WinWait($title, $text, $time)
        For $i = 1 To $time
                WinExists($title, $text) ? Return 1 : Sleep(1000)
        Next
EndFunc

 楼主| 发表于 2021-8-5 11:11:48 | 显示全部楼层
风行者 发表于 2021-8-5 10:53
最好控件用类名代替文本,用窗口工具查就知道

好的,风大,我先安你说的文本用类名去试试,谢谢
 楼主| 发表于 2021-8-5 19:43:21 | 显示全部楼层
风行者 发表于 2021-8-5 10:53
最好控件用类名代替文本,用窗口工具查就知道

风大,,窗口得到的信息如下:
>>>> 窗口 <<<<
标题:        Uninstall Microsoft Office
类名:        NativeHWNDHost
坐标:        98, 116
大小:        585, 449
样式:        0x96C80080
Ex样式:        0x00040100
句柄:        0x0000000000030480

>>>> 控件 <<<<
类名:        Button
接口:        1
高级类名:        Button1
名称:       
高级类:        [CLASS:Button; INSTANCE:1]
ID:       
文本:        下一步(&N)
坐标:        394, 378
大小:        90, 23
探测点坐标:        34, 11
样式:        0x50000001
Ex样式:        0x00000000
句柄:        0x000000000003043C



>>>> 鼠标 <<<<
坐标:        383, 132
光标 ID:        0
探测点颜色:        0xFFFFFF

>>>> 状态栏 <<<<

>>>> 工具栏 <<<<

>>>> 可见文本 <<<<
下一步(&N)
取消


>>>> 隐藏文本 <<<<
完成(&F)
联机阅读隐私声明
自动应用修复措施


我现在是这样写的,但是,你所指的,这个字本  部分‘下一步(&N)’        用类来顶替吗,但是加上类,判断就会失败的
WinWait('[TITLE:Uninstall Microsoft Office; CLASS:NativeHWNDHost]','下一步(&N)',2)

请问,这个文本要如何定义,才会更准确。  上午你给的哪个代码,运行不下去,提示有问题



 楼主| 发表于 2021-8-6 08:33:56 | 显示全部楼层
贴子不能沉下去呀,,哎,以前,同样用这个方式写的诺顿的卸载,就是一直OK的,没有像OFFICE卸载这样碰到奇怪的现象,等高手进来帮忙一下了,
 楼主| 发表于 2021-8-6 10:45:39 | 显示全部楼层
风行者 发表于 2021-8-5 10:53
最好控件用类名代替文本,用窗口工具查就知道

风大,,可否,再帮忙分析一下,我上面已经把,哪个卸载软件的相关的窗口捕获的信息,贴出来了,你看看,是不是,还有什么更好的办法,来判断这个窗口
发表于 2021-8-6 10:47:27 | 显示全部楼层
这个问题似乎折腾了几个月了…… 对于疑难杂症,要勤于添加调试代码
#include <Array.au3>

Local $hWin = _WinWaitDebug('Uninstall Microsoft Office', '下一步(&N)', 10) ;10秒内检测等待
If Not @error Then MsgBox(0, '已检测到窗口', $hWin)

Func _WinWaitDebug($sTitle, $sText = '', $iTimeout = 0)
        Opt('WinTitleMatchMode', -1)
        Local $hWin, $iTs = TimerInit()
        If $iTimeout > 0 Then
                $iTimeout *= 1000
                Do
                        Sleep(100)
                        If TimerDiff($iTs) >= $iTimeout Then
                                Local $aList = WinList(), $aWShow[UBound($aList) + 1][2], $ix = 0
                                For $i = 1 To $aList[0][0]
                                        If $aList[$i][0] <> '' And BitAND(WinGetState($aList[$i][1]), 2) Then
                                                $ix += 1
                                                $aWShow[$ix][0] = $aList[$i][0]
                                                $aWShow[$ix][1] = $aList[$i][1]
                                        EndIf
                                Next
                                If Not $ix Then Return SetError(2, 0, 0)
                                $aWShow[0][0] = $ix
                                ReDim $aWShow[$ix + 1][2]
                                _ArrayDisplay($aWShow, '已超时,未检测到窗口.当前可见窗口')
                                Return SetError(1, 0, 0)
                        EndIf
                        $hWin = WinGetHandle($sTitle, $sText)
                Until $hWin
        Else
                Do
                        Sleep(100)
                        $hWin = WinGetHandle($sTitle, $sText)
                Until $hWin
        EndIf
        Return $hWin
EndFunc   ;==>_WinWaitDebug

点评

这个写的有耐心呀,我都直接 for个sleep 来简单写个代码来确定在一定时间内是否超时的。  发表于 2021-8-6 13:30

评分

参与人数 1金钱 +88 收起 理由
绿色风 + 88 已收藏 ,使用你的的轮子

查看全部评分

 楼主| 发表于 2021-8-6 10:53:24 | 显示全部楼层
afan 发表于 2021-8-6 10:47
这个问题似乎折腾了几个月了…… 对于疑难杂症,要勤于添加调试代码

好的,A版,,是的这个问题,弄了快2个月了,哎,不知道为什么楼下的电脑时灵时不灵的,奇了怪了,对了,A版,再请教一下,利用句柄来判断窗口操作的话,是不是绝对无可能,再有文本来加入来判断操作了,一切忽略了?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 01:54 , Processed in 0.083506 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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