找回密码
 加入
搜索
查看: 682|回复: 1

[AU3基础] 【已解决】请教如何判断一个窗口出现后消失了然后又出现的状态?

[复制链接]
发表于 2022-4-16 06:56:51 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2022-4-16 17:53 编辑

目的:在脚本的界面上,打开网银的客户端版,或者网页版,然后将脚本最小化,等到用户关闭网银窗口,再弹出脚本界面,并且打开一个指定的目录。
做法:用一个变量$bWinexist来记录窗口的可见状态,最开始赋值为False,如果检测到目标窗口可见,然后把变量赋值为True。
困难:判断客户端版的可见状态没有问题,问题就出现在判断网页版的窗口的可见状态上面。因为网页版的网银,在登录的过程中,窗口的可见状态(BitAND(WinGetState("上海浦东发展银行公司网上银行"), 2)的值)会发生以下变化:
        窗口未出现时为0→打开网址后检测到窗口时为2→输入万登录密码和证书密码后竟然变为0→然后是进入网银里面才又变为2→用户关闭后变为0
        也就是说,在登录网页版网银的过程中,窗口竟然会消失一次,然后再出现。想用变量来记录窗口出现的次数,第一次出现赋值为1,第二次出现赋值为2,但是由于在while循环里,会一直累加上去。

        用WinGetProcess(WinGetHandle("上海浦东发展银行公司网上银行"))获取窗口的关联进程可以发现:
        窗口未出现时为0→打开网址后检测到窗口时为7832→准备输入万登录密码时竟然变为856→输入完密码变为0→然后是进入网银里面才又变为856→用户关闭后变为0


昨天自己研究了一天,没有找到很好的破解办法。
Global $bWinexist = False ;用来记录客户端网银窗口是否出现过。
Global $dOpenCishu = 0 ;用来记录保存截图文件的路径是否被打开过。
While 1
    ;当目标路径未打开,且任意一个网银窗口出现(激活)时:
    If BitAND(WinGetState("浦发银行网银客户端"), 2) Or BitAND(WinGetState("上海浦东发展银行公司网上银行"), 2) And Not WinExists("spdb_ScreenCapture") Then
        $bWinexist = True ;用来记录网银窗口出现了
        $dOpenCishu = 0 ;当网银窗口出现后,要把打开次数恢复为0,否则再次打开网银,就不会再执行ShellExecute($sPath)了。
    EndIf
   ;当打开次数为0(即$OpenCishu = 0,表示目标路径处于未打开状态),且网银窗口出现过(即$bWinexist = True),且网银窗口又被关闭时:
   If $dOpenCishu = 0 And Not WinExists("spdb_ScreenCapture") And Not WinExists("浦发银行网银客户端") And Not StringInStr(WinGetTitle("上海浦东发展银行公司网上银行"), "Internet Explorer") And Not StringInStr(WinGetTitle("上海浦东发展银行公司网上银行"), "用户配置") And $bWinexist = True Then
      If _WinAPI_PathIsDirectoryEmpty($sPath) = 0 Then ;如果目录不为空
           WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
           ShellExecute($sPath) ;打开指定的路径
           Sleep(100)
           Send("^a") ;选中文件,方便往微信窗口拖放。
           $dOpenCishu = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
       Else ;目录为空,只激活窗口。
           WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
           $dOpenCishu = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
       EndIf
     EndIf
WEnd
 楼主| 发表于 2022-4-16 17:51:25 | 显示全部楼层
解决了,用一个数组来记录每次一次窗口状态的变化值。
Global $aGetWeb[5] = [1, 1, 1, 1, 1]
Global $iag = 0
while 1
  ;当目标路径未打开,且任意一个网银窗口出现(激活)时:
  If BitAND(WinGetState("浦发银行网银客户端"), 2) And Not WinExists("spdb_ScreenCapture") Then
   $bKHWinExi = True ;用来记录网银窗口出现了
   $dKHOpenNum = 0 ;当网银窗口出现后,要把打开次数恢复为0,否则再次打开网银,就不会再执行ShellExecute($sPath)了。
  ElseIf BitAND(WinGetState("上海浦东发展银行公司网上银行"), 2) And Not WinExists("spdb_ScreenCapture") Then
   $bWebWinExi = True ;用来记录网银窗口出现了
   $dWebOpenNum = 0 ;当网银窗口出现后,要把打开次数恢复为0,否则再次打开网银,就不会再执行ShellExecute($sPath)了。
  EndIf
  ;网页版网银登录的过程中,窗口的可见状态会由可见变为不可见,然后再变为可见,也就是登录的过程中,会先消失再出现,所以简单的判断窗口从无到有,再到关闭,是不行的,
  ;必须将它的可见状态的变化存入数组中,即状态值变化过程为:0→2→0→2→0,第1个0表示窗口没有出现,第1个2表示窗口出现,第2个0,就是登录过程中窗口消失掉,第2个2,是窗口
  ;消失后又出现,第3个0,是用户关闭网页。
  Local $iGetWeb = BitAND(WinGetState("上海浦东发展银行公司网上银行"), 2) ;主循环每循环一次,就获取一次网页版网银窗口的状态值。
  If $iag = 0 Then
   $aGetWeb[$iag] = $iGetWeb ;把$iGetWeb的第一个值填入数组第一个元素。
   $iag = $iag + 1 ;主循环第一轮循环过后,把$iag的值变为1
  Else
   If $iGetWeb <> $aGetWeb[$iag - 1] Then ;第二轮循环时(以及第三、四...轮循环),判断$iGetWeb值与上一个已填入数组的元素对比,不相同就填入$iag这个位置中。
    $aGetWeb[$iag] = $iGetWeb
    $iag = $iag + 1
   EndIf
  EndIf
  ;当打开次数为0(即$OpenCishu = 0,表示目标路径处于未打开状态),且网银窗口出现过(即$bWinexist = True),且网银窗口又被关闭时:
  If $dKHOpenNum = 0 And Not WinExists("spdb_ScreenCapture") And Not WinExists("浦发银行网银客户端") And $bKHWinExi = True Then
   If _WinAPI_PathIsDirectoryEmpty($sPath) = 0 Then ;如果目录不为空
    WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
    ShellExecute($sPath) ;打开指定的路径
    Sleep(100)
    Send("^a") ;选中文件,方便往微信窗口拖放。
    $dKHOpenNum = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
    _FileWriteLog($hLogFile, '网银窗口出现后被关闭,弹出软件窗口并打开截图文件保存目录。')
   Else ;目录为空,只激活窗口。
    WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
    $dKHOpenNum = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
    _FileWriteLog($hLogFile, '网银窗口出现后被关闭,由于截图保存目录为空,不打开截图文件保存目录,只弹出软件窗口。')
   EndIf
   ;恢复数组的初始值
      For $i = 0 To 4
       $aGetWeb[$i] = 1
      Next
      $iag = 0
  ElseIf $dWebOpenNum = 0 And Not WinExists("spdb_ScreenCapture") And $aGetWeb[4] = 0 And $bWebWinExi = True Then
   If _WinAPI_PathIsDirectoryEmpty($sPath) = 0 Then ;如果目录不为空
    WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
    ShellExecute($sPath) ;打开指定的路径
    Sleep(100)
    Send("^a") ;选中文件,方便往微信窗口拖放。
    $dWebOpenNum = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
    _FileWriteLog($hLogFile, '网银窗口出现后被关闭,弹出软件窗口并打开截图文件保存目录。')
   Else ;目录为空,只激活窗口。
    WinActivate($idTitle) ;由于登录网银后脚本被最小化了,所以退出网银后,需要把处于最小化的脚本窗口激活,显示出来。
    $dWebOpenNum = 1 ;说明打开过目标路径了,就不会重复的执行ShellExecute($sPath)了。
    _FileWriteLog($hLogFile, '网银窗口出现后被关闭,由于截图保存目录为空,不打开截图文件保存目录,只弹出软件窗口。')
   EndIf
   ;恢复数组的初始值
      For $i = 0 To 4
       $aGetWeb[$i] = 1
      Next
      $iag = 0
  EndIf
wend
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-23 18:51 , Processed in 0.083795 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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