fjvip 发表于 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

fjvip 发表于 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);

这几种方式都兼容在一起使用了,还是没有办法。在安装过程中,中途有其它窗口影响,还是无法正常安装,请求各位高手帮助。

love5173 发表于 2013-1-6 14:02:33

回复 2# fjvip
首先你要确定是不是真的没有外部干扰能正常执行完毕
解决方案:
1、通过循环单步操作,反复激活指定窗口以达到点击的效果
2、大循环,通过swich操作实现安装,这样不用注意流程,即便是中途你手动点了几下也不影响正常安装
我只是提示一下,如果实在不行我可以帮你修改代码

annybaby 发表于 2013-1-6 14:04:19

楼主,代码是你自己写的吗??都明白代码的意思 ???

jtzxgfy 发表于 2013-1-6 14:05:58

http://www.autoitx.com/thread-34448-1-1.html
用这个自动代码生成 试试 

fjvip 发表于 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);暂停脚本的执行直至指定窗口被激活(成为活动状态)为止
把上面相关的窗口激活状态的命令都用上了,还是一样咯。希望得到帮助。

没有外部干扰可以完全安装。只要中途有其它窗口被 激活时,也就是当前窗口不是 自动安装的窗口激活状时,就停止最后的完成。

annybaby 发表于 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.......

fjvip 发表于 2013-1-6 20:33:07

你说的对,所以BlockInput这个我已经注释掉了。很多时候不是人为的。

fjvip 发表于 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


fjvip 发表于 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


页: [1]
查看完整版本: 自动安装软件,中途其它窗口激活时,被安装程序无法正常执行[已解决]