在该自动化项目实用过程中,虽然一定程度上提高了工作效率,但是偶尔的不作为,让人不是很爽。我花了一些时间对代码进行了再次优化,执行效率得到了显著提高。
代码优化的主要地方是:set_License那一块儿,常见的问题是:焦点获取不正确,导致send命令把Date或者HID发送到不合适的地方。
优化的途径是:
1. 写一个init方法,当调用该方法的时候,把焦点放到Grid的前列;
2. 写一个collapse方法,当调用该方法的时候,把Grid中展开的所有方法都收缩起来,防止send发送命令到不合适的地方;
3. 加了一个焦点判断。因为有几个控件的control ID是一致的,当实用controlGetText方法的时候,获取的text信息不正确,我加了一个判断,如果不正确,就重新获取焦点。
代码如下:
#include <ScreenCapture.au3>
#include <GuiConstantsEx.au3>#include <date.au3>#include <GuiTab.au3>Opt("WinTitleMatchMode")AutoItSetOption("SendKeyDelay")AutoItSetOption("WinWaitDelay");区域截图Func screen_capture($path) if FileExists($path)= 0 or StringInStr($path,"")=0 Then MsgBox(0, "Path Error", "Please input correct Path info!") Else $handle = WinGetHandle(".NET Reactor") if $handle="" then return 0 ConsoleWrite(_Now() & " "& "Screen capture win handle: " & $handle & @CRLF) WinActivate($handle) $control = ControlGetHandle($handle,"","[Name:groupBox6]") ConsoleWrite(_Now() & " "& "Screen capture Control handle: " & $control & @CRLF) ;_ScreenCapture_Capture("D:abc.jpg", 350,290,900,420) _ScreenCapture_CaptureWnd($path & "AutoIt.jpg", $control) EndIfEndFunc;无论焦点在哪儿,都回归到包含 EvaluationType 行Func init($handle) $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") ConsoleWrite(_Now()& " a "& $text & @CRLF) $text2 = $text While StringInStr($text, "EvaluationType =") = 0 ConsoleWrite(_Now()& " "& $text & @CRLF) ControlSend($handle,"","", "{UP}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") If $text = $text2 And $text2 = "False" Then ControlSend($handle,"","", "{Down}") ExitLoop EndIf WEnd ConsoleWrite(_Now()& " b "& $text & @CRLF)EndFunc;无论选项展开了多少次,都让所有的展开项收缩Func collapse($handle) $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") ControlSend($handle,"","", "{Down}") $text2 = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") While $text <> $text2 If StringInStr($text,$text2) <> 0 Then ControlSend($handle,"","", "{up}{enter}{down}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") ControlSend($handle,"","", "{Down}") $text2 = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") Else $text = $text2 ControlSend($handle,"","", "{Down}") $text2 = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") EndIf WEndEndFunc;设置 Hardware IDFunc set_hardwareID($hardware_id, $date) if StringLen($hardware_id) <> 24 or StringInStr($date,"-")=0 or StringLen($date)<8 Or StringLen($date)>10 Then MsgBox(0, "Create license error", "Please input correct License create info!") Else $handle = WinGetHandle(".NET Reactor") if $handle="" then return 0 ConsoleWrite(_Now() & " "& "Set hardware ID Window handle: " & $handle & @CRLF) WinActivate($handle) $tab_control = ControlGetHandle($handle,"", "[name:tabControl2]") _GUICtrlTab_ClickTab($tab_control, 2) SendKeepActive($handle) ControlSend($handle,"","", "{tab 4}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") While StringInStr($text, "RSAKeyValue") <>0 ControlSend($handle,"","", "{tab 4}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") WEnd init($handle) collapse($handle) init($handle) ;输入日期 ControlSend($handle,"","", "{down}{enter}{down 2}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") If StringInStr($text,"/") <>0 Then ControlSetText($handle,"", "[Class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1; Text:False]",$date) ControlSend($handle,"","", "{up 2}{enter}{up}") Else collapse($handle) init($handle) EndIf ;输入Hardware ID ControlSend($handle,"","", "{down 2}{enter}{down 2}") $text = ControlGetText($handle,"","[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]") If StringInStr($text,"-") <>0 Then ControlSetText($handle,"", "[Class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1; Text:False]",$hardware_id) ControlSend($handle,"","", "{up 2}{enter}{up 2}") Else collapse($handle) init($handle) EndIf EndIfEndFunc;保存 LicenseFunc save_license($path) if FileExists($path)= 0 or StringInStr($path,"")=0 Then MsgBox(0, "Path Error", "Please input correct Path info!") Else $handle = WinGetHandle(".NET Reactor") if $handle="" then return 0 ConsoleWrite(_Now() & " "& "Save License win handle: " & $handle & @CRLF) WinActivate($handle) $control_handle = ControlGetHandle($handle,"","[Name:button1]") ConsoleWrite(_Now() & " "& "Save License Create License button: " & $handle & @CRLF) ControlClick($handle,"",$control_handle) $check = WinWaitActive("Save License As..") if $check = 0 Then ConsoleWrite(_Now() & " " & "Save License As pop up window failed" & @CRLF) Return 0 EndIf $save_window_handle = WinGetHandle("Save License As..") ConsoleWrite(_Now() & " "& "Save License popup window handle: " & $save_window_handle & @CRLF) $save_input_control = ControlGetHandle($save_window_handle,"","Edit1") ConsoleWrite(_Now() & " "& "Save License input field handle: " & $save_input_control & @CRLF) ControlSetText($save_window_handle,"",$save_input_control,$path & "SageTouch.License") $save_button_handle = ControlGetHandle($save_window_handle,"","Button1") ConsoleWrite(_Now() & " "& "Save License Save button: " & $save_button_handle & @CRLF) ControlClick($save_window_handle,"",$save_button_handle) if WinWait("确认另存为","",1)<>0 Then $popup_handle = WinGetHandle("确认另存为") WinWaitActive($popup_handle) ControlClick($popup_handle,"", "Button1") EndIf EndIf ;获取窗口句柄EndFunc;检查 License 是否是正确的Func exam_license($path) If FileExists($path & "SageTouch.License")=0 or StringInStr($path,"")=0 Then MsgBox(0, "Exam license","Can not find license to exam") Else $handle = WinGetHandle(".NET Reactor") if $handle="" then return 0 WinActivate($handle) SendKeepActive($handle) $handle2 = ControlGetHandle($handle, "", "[NAME:menuStrip1]") if $handle2 = "" then return 0 ConsoleWrite(_Now() & " " & "Get menu handle" & $handle2 & @CRLF) ControlSend($handle, "","","{ALT}{Tab 2}{Enter}{Down}{Enter}") $check = WinWaitActive("License Examiner", "", 5) if $check = 0 Then ConsoleWrite(_Now() & " " & "License Examiner pop up window failed" & @CRLF) Return 0 EndIf $license_exam_handle = WinGetHandle("License Examiner") ConsoleWrite(_Now() & " "& "License examiner window handle: " & $license_exam_handle & @CRLF) $open_license_handle = ControlGetHandle($license_exam_handle,"","[Name:button2]") ConsoleWrite(_now() & " Open License button handle: "&$open_license_handle & @CRLF) ControlClick($license_exam_handle,"",$open_license_handle) $check = WinWaitActive("Please Select License File", "", 5) if $check = 0 Then ConsoleWrite(_Now() & " " & "Select License File pop up window failed" & @CRLF) Return 0 EndIf $select_license_handle = WinGetHandle("Please Select License File") ConsoleWrite(_Now()& " "& "Select License File window handle: " & $select_license_handle & @CRLF) $select_license_input_handle = ControlGetHandle($select_license_handle,"","Edit1") $open_button_handle = ControlGetHandle($select_license_handle,"","Button1") ControlSetText($select_license_handle,"",$select_license_input_handle,$path & "SageTouch.License") ControlClick($select_license_handle,"",$open_button_handle) EndIfEndFunc;Create a new GUIGUICreate("Create License", 700, 300)GUICtrlCreateLabel("Hardware ID", 30, 30, 250, 20)$hardware_id = GUICtrlCreateInput("33DD-8F20-FA26-7E2A-CDE6", 30, 50, 250, 20)GUICtrlCreateLabel("Expire Date", 300, 30, 200, 20)$date = GUICtrlCreateInput("2013-10-1", 300, 50, 200, 20)GUICtrlCreateLabel("License File Path", 30, 100, 120, 20)$path = GUICtrlCreateInput("", 30, 120, 470, 20)$exam_License = GUICtrlCreateButton("Exam License", 30, 170, 120, 20)$Create_License = GUICtrlCreateButton("Create License", 180, 170, 120, 20)$Save_License = GUICtrlCreateButton("Save License", 330, 170, 120, 20)$Screen_Capture = GUICtrlCreateButton("Screen Capture", 480, 170, 120, 20)GUISetState()While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit Case $msg = $Create_License set_hardwareID(GUICtrlRead($hardware_id), GUICtrlRead($date)) Case $msg = $Screen_Capture screen_capture(GUICtrlRead($path)) Case $msg = $Save_License save_license(GUICtrlRead($path)) Case $msg = $exam_License exam_license(GUICtrlRead($path)) EndSelectWend通过该段代码的反复修改:
1. 提高了我对controlSend命令的认识,代码的设计关系到该命令的效率,准确性;
2. 加强了我对while循环的掌握;
3. 以后出现反复验证的问题,应该能够参考该代码。