找回密码
 加入
搜索
查看: 4029|回复: 14

[AU3基础] 已解决 如何判断AU3运行进程是否顺利

[复制链接]
发表于 2020-10-27 13:22:29 | 显示全部楼层 |阅读模式
本帖最后由 itzyx 于 2020-10-28 20:13 编辑

其实这个问题 我自己也不太好描述,因为我本身也是个菜鸟,但这个问题一直挺困扰我的,就有的时候我们写一段代码,大部分都是理想状态下的, 如果中间可能会出现的错误没考虑进去的话, 就会导致整个自动化程序无法运行。
就比如运行文件名为:$file 的文件,我们可以用:ShellExecute($file)
但是如果文件不存在,就会出现错误!
我们需要完善一下代码:

If FileExists($file) Then                                 ;检查指定文件或目录是否存在。
        ShellExecute($file)                               ;运行自定义 $file 函数文件
Else
        MsgBox(48, '', $file & ' 不存在。')               ;否则提示文件不存在
EndIf

这样如果文件不存在,就会提示“文件不存在”的错误。
然后通过这个错误信息,再去判断是否要新建一个文件,还是其他操作。

但是我现在想打开一个软件,理想状态下是用 Run 打开软件,然后获取窗口信息,再执行下面的代码。
但是软件端出现的错误,我们是不知道的,怎么判断是否会出现错误弹框?
如果有错误, 能否添加一个循环语句? 重新打开软件,直到获取窗口信息正常.
再如果软件打开有进度条,怎么能等进度条运行完毕,执行下面的窗口操作?

(最近问的问题比较多,但是我都是经过自己思考过后,没有思路,没有办法才问的,希望能通过大佬们的指点后,掌握更多的知识,每次请教完,我也会想办法去理解其中的意思,不断的去应用的)
发表于 2020-10-27 13:40:15 | 显示全部楼层
尽可能多的收集Run后的进程信息,以作为判断是否进入正常状态的依据。
比如:加载中、消息弹窗、正常等等…
Run 后循环检测进程信息,属于何种状态再做处理
 楼主| 发表于 2020-10-27 14:11:55 | 显示全部楼层
afan 发表于 2020-10-27 13:40
尽可能多的收集Run后的进程信息,以作为判断是否进入正常状态的依据。
比如:加载中、消息弹窗、正常等等 ...

A大那用什么函数 可以判断或者获取 run后的进程信息呢,
我之前用ProcessExists 检查指定进程是否存在,如果 “加载 ”这个弹框进程消失,则进行下面的代码,但是我用你的Au3.WProbe 获取加载 这个弹框的进程的名称时候,好像与主窗口的进程名称一样,那该如何解决
发表于 2020-10-27 14:32:41 | 显示全部楼层
进程信息有很多,不要局限于标题文本等。比如可用窗口句柄枚举是否有子窗口(弹窗)、(弹窗)窗口的尺寸或样式等
 楼主| 发表于 2020-10-27 14:49:01 | 显示全部楼层
afan 发表于 2020-10-27 14:32
进程信息有很多,不要局限于标题文本等。比如可用窗口句柄枚举是否有子窗口(弹窗)、(弹窗)窗口的尺寸或样式 ...

A大 你的意思是说,比如正常状况下就一个主窗口, 获取窗口句柄,枚举是否有子窗口弹出,如果有判断属于何种状态再做处理嘛?
额,我有点菜,有几个问题不懂,第一个,怎么通过 窗口句柄枚举是否有子窗口? 第二个,如何判断进程信息属于何种状态(正确的弹框,跟错误的弹框怎么区分)
发表于 2020-10-27 15:30:55 | 显示全部楼层
程序都没有说个球。
Local $iPID = Run('你的程序.exe')
Local $aData = _WinAPI_EnumProcessWindows($iPID, 1)
具体查看数组信息,比如 $aData[0][0] > 1 则有子窗口
多看帮助,多用函数询捕搜索帮助。

评分

参与人数 1金钱 +20 收起 理由
itzyx + 20 很给力!

查看全部评分

 楼主| 发表于 2020-10-27 15:34:29 | 显示全部楼层
afan 发表于 2020-10-27 15:30
程序都没有说个球。
Local $iPID = Run('你的程序.exe')
Local $aData = _WinAPI_EnumProcessWindows($iP ...

  哈哈,问的傻缺了,嗯呢,好的,我知道了, 我每次都会先用函数询捕搜索帮助 查看,再搜素论坛有没有类似问题,最后发表帖子 求助
发表于 2020-10-27 15:52:54 | 显示全部楼层
我知道你是很认真的,这样进步肯定也会很快。基础都是练出来的~
你的提问描述都比较具体,比一些不知所谓的问题强太多。
 楼主| 发表于 2020-10-27 16:06:10 | 显示全部楼层
afan 发表于 2020-10-27 15:52
我知道你是很认真的,这样进步肯定也会很快。基础都是练出来的~
你的提问描述都比较具体,比一些不知所谓 ...

难得,受到A大夸奖,  有A大 这句话,我学习更有劲了   
 楼主| 发表于 2020-10-28 17:11:23 | 显示全部楼层
itzyx 发表于 2020-10-27 16:06
难得,受到A大夸奖,  有A大 这句话,我学习更有劲了
#include <Array.au3>
 #include <WinAPIProc.au3>

Local $iPID = Run('我的程序.exe')  ;运行我的程序
WinActivate('我的程序')  ;激活窗口
Do
Local $aData = _WinAPI_EnumProcessWindows($iPID, True)  ;枚举窗口句柄或者类别名
If $aData[0][0]>1 Then                                  ;如果$aData[0][0] > 1 则有子窗口
        MsgBox(0+64,"提示","有子窗口弹出",1)                 ;提示错误
        WinClose(($aData[1][0]))                                 ;关闭窗口
Else
        sleep(1000)
EndIf
sleep(20000)
Until $aData[0][0]=1
MsgBox(0+64,"提示","没有子窗口弹出",1)


试了一下,在打开软件的几十秒 会检测有无弹窗,现在暂时还没遇到其他问题, 最后感谢A大的提醒
发表于 2020-10-28 17:26:44 | 显示全部楼层
itzyx 发表于 2020-10-28 17:11
试了一下,在打开软件的几十秒 会检测有无弹窗,现在暂时还没遇到其他问题, 最后感谢A大的提醒

看你的描述结合你的代码,我估计你运行的程序并非启动时就有弹窗,需要一个等待期检测,我建议如下:
如果已是正常状态(已检测到该状态信息),就直接通过。反之,则循环及另作处理。
发表于 2020-10-28 17:42:11 | 显示全部楼层
#include <WinAPIProc.au3>

Local $iPID = Run('我的程序.exe') ;运行我的程序
Local $hWin = WinWait('我的程序标题')
Local $aData
;>>>>>>>>>> 以下假定程序非正常状态时,窗口不会有关键字,在关闭弹窗后才进入有关键字的正常状态
While Not StringInStr(WinGetText($hWin), '正常状态窗口含有的文本')        ;>>>>>>>>>> 这里假定判断正常窗口的依据为窗口含有某关键字
        Sleep(100)
        $aData = _WinAPI_EnumProcessWindows($iPID, True) ;枚举窗口句柄或者类别名
        If $aData[0][0] > 1 Then ;如果$aData[0][0] > 1 则有子窗口
                MsgBox(48, '提示', '有子窗口弹出', 1) ;提示错误
                WinClose(($aData[1][0])) ;关闭窗口
        Else
                MsgBox(48, '提示', '无子窗口,但也无关键字', 1) ;提示错误
        EndIf
WEnd
MsgBox(64, '提示', '已是正常状态', 1)
 楼主| 发表于 2020-10-28 19:55:47 | 显示全部楼层

恩恩, 这个可以,  不过正常状态下窗口含有的文本,和非正常状态下含有的文本,确实要收集一下。我要多试几次才行。 A大 追问一下,软件打开时,在这个窗口内 弹出的错误码,或者弹框 ,都属于主窗口的文本嘛 ?
发表于 2020-10-28 20:05:34 | 显示全部楼层
itzyx 发表于 2020-10-28 19:55
恩恩, 这个可以,  不过正常状态下窗口含有的文本,和非正常状态下含有的文本,确实要收集一下。我要多 ...

弹窗文本不属于主窗,都是各自的,没看到我 WinGetText($hWin) 使用的是窗口句柄吗?如果用标题字符串可能获取的并非主窗口,而是拥有与主窗口相同标题的子窗口。
 楼主| 发表于 2020-10-28 20:12:31 | 显示全部楼层
afan 发表于 2020-10-28 20:05
弹窗文本不属于主窗,都是各自的,没看到我 WinGetText($hWin) 使用的是窗口句柄吗?如果用标题字符串可 ...

好的 ,了解了 ,到时候多试几次, 有问题再改善一下  
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:41 , Processed in 0.077292 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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