itzyx 发表于 2020-10-27 13:22:29

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

本帖最后由 itzyx 于 2020-10-28 20:13 编辑

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

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

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

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

(最近问的问题比较多,但是我都是经过自己思考过后,没有思路,没有办法才问的,希望能通过大佬们的指点后,掌握更多的知识,每次请教完,我也会想办法去理解其中的意思,不断的去应用的)

afan 发表于 2020-10-27 13:40:15

尽可能多的收集Run后的进程信息,以作为判断是否进入正常状态的依据。
比如:加载中、消息弹窗、正常等等…
Run 后循环检测进程信息,属于何种状态再做处理

itzyx 发表于 2020-10-27 14:11:55

afan 发表于 2020-10-27 13:40
尽可能多的收集Run后的进程信息,以作为判断是否进入正常状态的依据。
比如:加载中、消息弹窗、正常等等 ...

A大那用什么函数 可以判断或者获取 run后的进程信息呢,
我之前用ProcessExists 检查指定进程是否存在,如果 “加载 ”这个弹框进程消失,则进行下面的代码,但是我用你的Au3.WProbe 获取加载 这个弹框的进程的名称时候,好像与主窗口的进程名称一样,那该如何解决

afan 发表于 2020-10-27 14:32:41

进程信息有很多,不要局限于标题文本等。比如可用窗口句柄枚举是否有子窗口(弹窗)、(弹窗)窗口的尺寸或样式等

itzyx 发表于 2020-10-27 14:49:01

afan 发表于 2020-10-27 14:32
进程信息有很多,不要局限于标题文本等。比如可用窗口句柄枚举是否有子窗口(弹窗)、(弹窗)窗口的尺寸或样式 ...

A大 你的意思是说,比如正常状况下就一个主窗口, 获取窗口句柄,枚举是否有子窗口弹出,如果有判断属于何种状态再做处理嘛?
额,我有点菜,有几个问题不懂,第一个,怎么通过 窗口句柄枚举是否有子窗口? 第二个,如何判断进程信息属于何种状态(正确的弹框,跟错误的弹框怎么区分)

afan 发表于 2020-10-27 15:30:55

程序都没有说个球。
Local $iPID = Run('你的程序.exe')
Local $aData = _WinAPI_EnumProcessWindows($iPID, 1)
具体查看数组信息,比如 $aData > 1 则有子窗口
多看帮助,多用函数询捕搜索帮助。

itzyx 发表于 2020-10-27 15:34:29

afan 发表于 2020-10-27 15:30
程序都没有说个球。
Local $iPID = Run('你的程序.exe')
Local $aData = _WinAPI_EnumProcessWindows($iP ...

{:1_296:}哈哈,问的傻缺了,嗯呢,好的,我知道了, 我每次都会先用函数询捕搜索帮助 查看,再搜素论坛有没有类似问题,最后发表帖子 求助

afan 发表于 2020-10-27 15:52:54

我知道你是很认真的,这样进步肯定也会很快。基础都是练出来的~
你的提问描述都比较具体,比一些不知所谓的问题强太多。

itzyx 发表于 2020-10-27 16:06:10

afan 发表于 2020-10-27 15:52
我知道你是很认真的,这样进步肯定也会很快。基础都是练出来的~
你的提问描述都比较具体,比一些不知所谓 ...

难得,受到A大夸奖,有A大 这句话,我学习更有劲了   {:1_326:}

itzyx 发表于 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>1 Then                                  ;如果$aData > 1 则有子窗口
        MsgBox(0+64,"提示","有子窗口弹出",1)               ;提示错误
        WinClose(($aData))                                 ;关闭窗口
Else
        sleep(1000)
EndIf
sleep(20000)
Until $aData=1
MsgBox(0+64,"提示","没有子窗口弹出",1)


试了一下,在打开软件的几十秒 会检测有无弹窗,现在暂时还没遇到其他问题, 最后感谢A大的提醒

afan 发表于 2020-10-28 17:26:44

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

看你的描述结合你的代码,我估计你运行的程序并非启动时就有弹窗,需要一个等待期检测,我建议如下:
如果已是正常状态(已检测到该状态信息),就直接通过。反之,则循环及另作处理。

afan 发表于 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 > 1 Then ;如果$aData > 1 则有子窗口
                MsgBox(48, '提示', '有子窗口弹出', 1) ;提示错误
                WinClose(($aData)) ;关闭窗口
        Else
                MsgBox(48, '提示', '无子窗口,但也无关键字', 1) ;提示错误
        EndIf
WEnd
MsgBox(64, '提示', '已是正常状态', 1)

itzyx 发表于 2020-10-28 19:55:47

afan 发表于 2020-10-28 17:42


恩恩, 这个可以,不过正常状态下窗口含有的文本,和非正常状态下含有的文本,确实要收集一下。我要多试几次才行。 A大 追问一下,软件打开时,在这个窗口内 弹出的错误码,或者弹框 ,都属于主窗口的文本嘛 ?

afan 发表于 2020-10-28 20:05:34

itzyx 发表于 2020-10-28 19:55
恩恩, 这个可以,不过正常状态下窗口含有的文本,和非正常状态下含有的文本,确实要收集一下。我要多 ...

弹窗文本不属于主窗,都是各自的,没看到我 WinGetText($hWin) 使用的是窗口句柄吗?如果用标题字符串可能获取的并非主窗口,而是拥有与主窗口相同标题的子窗口。

itzyx 发表于 2020-10-28 20:12:31

afan 发表于 2020-10-28 20:05
弹窗文本不属于主窗,都是各自的,没看到我 WinGetText($hWin) 使用的是窗口句柄吗?如果用标题字符串可 ...

好的 ,了解了 ,到时候多试几次, 有问题再改善一下
页: [1]
查看完整版本: 已解决 如何判断AU3运行进程是否顺利