【已解决】请教如何判断一个窗口出现后消失了然后又出现的状态?
本帖最后由 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
解决了,用一个数组来记录每次一次窗口状态的变化值。
Global $aGetWeb =
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 = 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
页:
[1]