找回密码
 加入
搜索
查看: 4860|回复: 9

[AU3基础] 自动安装软件,中途其它窗口激活时,被安装程序无法正常执行[已解决]

  [复制链接]
发表于 2013-1-6 11:55:33 | 显示全部楼层 |阅读模式
本帖最后由 fjvip 于 2013-1-6 22:14 编辑
#NoTrayIcon ;脚本开始执行时不显示托盘的图标
Opt("TrayIconDebug", 1) ;0=无信息, 1=调试信息
Opt("WinTextMatchMode", 2) ;1=完全匹配, 2=快速匹配
Opt("WinTitleMatchMode", 4) ;1=开头, 2=子串, 3=完全, 4=高级
Opt("WinSearchChildren", 1) ;0=不搜索, 1=搜索子窗口
Opt("WinDetectHiddenText", 1) ;0=不检测, 1=检测

;--------------------------------------------------------------;设置脚本参数
$WinTitle_1= '安装 - 迅闪2011客户端'
$Wintxt_1= '下一步(&N) >'
$Wintxt_2= '许可协议'
$Wintxt_3= '选择目标位置'
$Wintxt_4= '完成(&F)'
;--------------------------------------------------------------;窗口元素变量声明
$path = "D:\Program Files\HintSoft\GameMenu\Data\Client.ini"
$ip = "192.168.1.253"

$Exe = '120428XsClient.exe'
If ProcessExists($Exe) Then ProcessClose($Exe)
If Run($Exe) = 0 Then ShellExecute($Exe)

Do
        Sleep(10);
        
Until WinExists($Wintitle_1)

;WinMove($Wintitle_1, "", -1000, -1000)
;--------------------------------------------------------------;程序启动,显示界面
WinSetOnTop($Wintitle_1, "", 1);窗口置顶
;BlockInput (1);锁定输入

If Not WinActive($Wintitle_1, "") Then WinActivate("$Wintitle_1", "") 
SendKeepActive($Wintitle_1,"") 
WinWaitActive($Wintitle_1, $Wintxt_1);
ControlClick($Wintitle_1, $Wintxt_1, "TNewButton1");---------------;点击按钮控件: 下一步(&N) >

If Not WinActive($Wintitle_1, "") Then WinActivate("$Wintitle_1", "") 
SendKeepActive($Wintitle_1,"") 
WinWaitActive($Wintitle_1, $Wintxt_2);
ControlClick($Wintitle_1, $Wintxt_2, "TNewRadioButton1");---------------;点击按钮控件: 我同意此协议(&A)


ControlClick($Wintitle_1, $Wintxt_2, "TNewButton2");---------------;点击按钮控件: 下一步(&N) >

If Not WinActive($Wintitle_1, "") Then WinActivate("$Wintitle_1", "") 
SendKeepActive($Wintitle_1,"") 
WinWaitActive($Wintitle_1, $Wintxt_3);
ControlSetText($Wintitle_1, $Wintxt_3, "TEdit1", "D:\Program Files\Hintsoft\GameMenu");------;重置文本框控件文本

ControlClick($Wintitle_1, $Wintxt_3, "TNewButton3");---------------;点击按钮控件: 下一步(&N) >

If Not WinActive($Wintitle_1, $Wintxt_4) Then WinActive($Wintitle_1, $Wintxt_4)
SendKeepActive($Wintitle_1,"") 
WinSetState($Wintitle_1, "", @SW_ENABLE)
WinWaitActive($Wintitle_1, $Wintxt_4);
ControlClick($Wintitle_1, $Wintxt_4, "TNewButton3");---------------;点击按钮控件: 完成(&F)

BlockInput (0)
ProcessWait("DriversInstall.exe");---------------;一直等待此进程出现
If ProcessExists("DriversInstall.exe") Then ;判断进程是否存在
   ProcessClose("DriversInstall.exe");结束进程
EndIf 

IniWrite($path, "Server", "ip", $ip)
MsgBox(64, "安装完成!", "迅闪游戏菜单已经安装设置完毕!", 3)

;Sleep(500) ;等待两秒
Opt("TrayIconHide", 0) ;不隐藏图标
Exit
 楼主| 发表于 2013-1-6 11:56:55 | 显示全部楼层
If Not WinActive($Wintitle_1, $Wintxt_4) Then WinActive($Wintitle_1, $Wintxt_4)
SendKeepActive($Wintitle_1,"")

WinSetState($Wintitle_1, "", @SW_ENABLE)

WinWaitActive($Wintitle_1, $Wintxt_4);

这几种方式都兼容在一起使用了,还是没有办法。在安装过程中,中途有其它窗口影响,还是无法正常安装,请求各位高手帮助。
发表于 2013-1-6 14:02:33 | 显示全部楼层
回复 2# fjvip
首先你要确定是不是真的没有外部干扰能正常执行完毕
解决方案:
1、通过循环单步操作,反复激活指定窗口以达到点击的效果
2、大循环,通过swich操作实现安装,这样不用注意流程,即便是中途你手动点了几下也不影响正常安装
我只是提示一下,如果实在不行我可以帮你修改代码
发表于 2013-1-6 14:04:19 | 显示全部楼层
楼主,代码是你自己写的吗??都明白代码的意思 ???
发表于 2013-1-6 14:05:58 | 显示全部楼层
http://www.autoitx.com/thread-34448-1-1.html
用这个自动代码生成 试试 
 楼主| 发表于 2013-1-6 18:20:15 | 显示全部楼层

本帖最后由 fjvip 于 2013-1-6 18:24 编辑

If Not WinActive($Wintitle_1, "") Then WinActivate("$Wintitle_1", "") ;检查指定的变量($Wintitle_1)窗口是否存在且当前被激活
SendKeepActive($Wintitle_1,"") ;在使用Send()函数时,尝试保持指定窗口激活状态
WinActivate($Wintitle_1, $Wintxt_2) ;激活指定的窗口
WinWaitActive($Wintitle_1, $Wintxt_2);暂停脚本的执行直至指定窗口被激活(成为活动状态)为止
把上面相关的窗口激活状态的命令都用上了,还是一样咯。希望得到帮助。

没有外部干扰可以完全安装。只要中途有其它窗口被 激活时,也就是当前窗口不是 自动安装的窗口激活状时,就停止最后的完成。
发表于 2013-1-6 19:29:29 | 显示全部楼层
回复 6# fjvip

1.都不知道你回复的是谁~~

2.SendKeepActive($Wintitle_1,"") ;在使用Send()函数时,尝试保持指定窗口激活状态

3.你从头到尾似乎都没有用过send()函数,却不断地SendKeepActive
4.BlockInput没用的,因为你的窗体失去焦点,大多数都不是人为的~~
5.尽量避免使用WinWaitActive函数,否则你永远无法知道你的程序会暂停在何处并且无法完成~~
6.就算你一定要用,也应该加个等待超时的参数,不能一直等,到超时后再激活下,再检查,直到完成
7.Control**系列函数是不用前台的, 如果你不断地激活窗体,不如使用mouseclick,这样至少不怕失去焦点
8.如果,点击无法成功,在使用Control**时可以考虑先设置一下焦点(或者激活一下,可以提高成功率,这个也是帮助文档建议的,除非你希望是全后台的)
.......
N.......
 楼主| 发表于 2013-1-6 20:33:07 | 显示全部楼层
你说的对,所以BlockInput这个我已经注释掉了。很多时候不是人为的。
 楼主| 发表于 2013-1-6 21:32:48 | 显示全部楼层
问题已经解决了,代码如下。谢谢大家帮忙。
;--------------------------------------------------------------;脚本开始
#NoTrayIcon ;脚本开始执行时不显示托盘的图标
Opt("TrayIconDebug", 1) ;0=无信息, 1=调试信息
Opt("WinTextMatchMode", 2) ;1=完全匹配, 2=快速匹配
Opt("WinTitleMatchMode", 4) ;1=开头, 2=子串, 3=完全, 4=高级
Opt("WinSearchChildren", 1) ;0=不搜索, 1=搜索子窗口
Opt("WinDetectHiddenText", 1) ;0=不检测, 1=检测

;--------------------------------------------------------------;设置脚本参数
$WinTitle_1 = '安装 - 迅闪2011客户端'
$Wintxt_1 = '下一步(&N) >'
$Wintxt_2 = '许可协议'
$Wintxt_3 = '选择目标位置'
$wintxt_4 = '安装向导完成'
$Wintxt_5 = '完成(&F)'
;--------------------------------------------------------------;窗口元素变量声明
$path = "D:\Program Files\HintSoft\GameMenu\Data\Client.ini"
$ip = "192.168.1.253"

$Exe = '120428XsClient.exe'
If ProcessExists($Exe) Then ProcessClose($Exe)
If Run($Exe) = 0 Then ShellExecute($Exe)

Do
        Sleep(10);
        
Until WinExists($WinTitle_1)

;WinMove($Wintitle_1, "", -1000, -1000)
;--------------------------------------------------------------;程序启动,显示界面
;WinSetOnTop($Wintitle_1, "", 1);窗口置顶
;BlockInput (1);屏蔽鼠标与键盘(输入).

If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")

        WinWaitActive($WinTitle_1, $Wintxt_1);
        ControlClick($WinTitle_1, $Wintxt_1, "TNewButton1");---------------;点击按钮控件: 下一步(&N) >
        
EndIf

If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")

        WinWaitActive($WinTitle_1, $Wintxt_2);
        ControlClick($WinTitle_1, $Wintxt_2, "TNewRadioButton1");---------------;点击按钮控件: 我同意此协议(&A)


        ControlClick($WinTitle_1, $Wintxt_2, "TNewButton2");---------------;点击按钮控件: 下一步(&N) >
EndIf

If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")

        WinWaitActive($WinTitle_1, $Wintxt_3);
        ControlSetText($WinTitle_1, $Wintxt_3, "TEdit1", "D:\Program Files\Hintsoft\GameMenu");------;重置文本框控件文本

        ControlClick($WinTitle_1, $Wintxt_3, "TNewButton3");---------------;点击按钮控件: 下一步(&N) >
EndIf

Do
        Sleep(10);
        
Until WinExists($WinTitle_1, $Wintxt_4);

If WinExists($WinTitle_1, "") Then
        WinActivate($WinTitle_1, "")
        WinWaitActive($WinTitle_1, $Wintxt_4);
        
        ControlClick($WinTitle_1, $Wintxt_4, "TNewButton3");---------------;点击按钮控件: 完成(&F) >
EndIf

BlockInput(0);启用鼠标与键盘(输入).

ProcessWait("DriversInstall.exe");---------------;一直等待此进程出现
If ProcessExists("DriversInstall.exe") Then ;判断进程是否存在
        ProcessClose("DriversInstall.exe");结束进程
EndIf

IniWrite($path, "Server", "ip", $ip);向迅闪配置文件中写入服务器IP地址
MsgBox(64, "安装完成!", "迅闪游戏菜单已经安装设置完毕!", 1)
;Sleep(500) ;等待
Opt("TrayIconHide", 0) ;不隐藏图标
Exit
 楼主| 发表于 2013-1-7 11:15:22 | 显示全部楼层
#NoTrayIcon
;--------------------------------------------------------------;脚本开始
Opt("TrayIconDebug", 1) ;0=无信息, 1=调试信息
Opt("WinTextMatchMode", 2) ;1=完全匹配, 2=快速匹配
Opt("WinTitleMatchMode", 4) ;1=开头, 2=子串, 3=完全, 4=高级
Opt("WinSearchChildren", 1) ;0=不搜索, 1=搜索子窗口
Opt("WinDetectHiddenText", 1) ;0=不检测, 1=检测

;--------------------------------------------------------------;设置脚本参数
$WinTitle_1 = '安装 - 迅闪2011客户端'
$Wintxt_1 = '下一步(&N) >'
$Wintxt_2 = '许可协议'
$Wintxt_3 = '选择目标位置'
$wintxt_4 = '安装向导完成'
$Wintxt_5 = '完成(&F)'
;--------------------------------------------------------------;窗口元素变量声明
$path = "D:\Program Files\HintSoft\GameMenu\Data\Client.ini"
$ip = "192.168.1.253"

$Exe = '120428XsClient.exe'
If ProcessExists($Exe) Then ProcessClose($Exe)
If Run($Exe) = 0 Then ShellExecute($Exe)

Do
        Sleep(10);
        
Until WinExists($WinTitle_1)

;WinMove($Wintitle_1, "", -1000, -1000)
;--------------------------------------------------------------;程序启动,显示界面
;WinSetOnTop($Wintitle_1, "", 1);窗口置顶
;BlockInput (1);屏蔽鼠标与键盘(输入).

If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")
        WinWaitActive($WinTitle_1, $Wintxt_1, 1);
        WinActivate($WinTitle_1, $Wintxt_1)
EndIf

ControlClick($WinTitle_1, $Wintxt_1, "TNewButton1");---------------;点击按钮控件: 下一步(&N) >


If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")
        WinWaitActive($WinTitle_1, $Wintxt_2, 1);
        WinActivate($WinTitle_1, $Wintxt_2)
EndIf

ControlClick($WinTitle_1, $Wintxt_2, "TNewRadioButton1");---------------;点击按钮控件: 我同意此协议(&A)

ControlClick($WinTitle_1, $Wintxt_2, "TNewButton2");---------------;点击按钮控件: 下一步(&N) >


If WinExists($WinTitle_1, "") Then
        WinActivate("$Wintitle_1", "")
        WinWaitActive($WinTitle_1, $Wintxt_3, 1);
        WinActivate($WinTitle_1, $Wintxt_3)
EndIf

ControlSetText($WinTitle_1, $Wintxt_3, "TEdit1", "D:\Program Files\Hintsoft\GameMenu");------;重置文本框控件文本

ControlClick($WinTitle_1, $Wintxt_3, "TNewButton3");---------------;点击按钮控件: 下一步(&N) >



Do
        Sleep(10);
        
Until WinExists($WinTitle_1, $wintxt_4);

If WinExists($WinTitle_1, "") Then
        WinActivate($WinTitle_1, "")
        WinWaitActive($WinTitle_1, $wintxt_4, 1);
        WinActivate($WinTitle_1, $wintxt_4)
        ControlClick($WinTitle_1, $wintxt_4, "TNewButton3");---------------;点击按钮控件: 完成(&F) >
EndIf

BlockInput(0);启用鼠标与键盘(输入).

ProcessWait("DriversInstall.exe");---------------;一直等待此进程出现
If ProcessExists("DriversInstall.exe") Then ;判断进程是否存在
        ProcessClose("DriversInstall.exe");结束进程
EndIf

IniWrite($path, "Server", "ip", $ip);向迅闪配置文件中写入服务器IP地址
MsgBox(64, "安装完成!", "迅闪游戏菜单已经安装设置完毕!", 0.5)
Opt("TrayIconHide", 0) ;不隐藏图标
Exit
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-29 13:18 , Processed in 0.096985 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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