##title##

2018年3月22日

Autohotkey:有UI介面的自動化外掛

寫了一個公司系統的自動化外掛,突破了幾個功能。


  1. 實現用Chrome讀取條顏色判斷時間
  2. 用Chrome搜尋文字功能來定位座標
  3. UI介面,文字顯示進度與花費時間
  4. 計算預期完成時間
  5. 圖像化進度條顯示進度
  6. 自動輸出可節省的動作和時間純文字日誌


雖然有些功能是該工具介面限定,但有些概念還是共通,在此紀錄一下。
F12::
V_PluginName = 權限管理外掛
V_Version = v6.3
V_Game = AAA, BBB ;遊戲
V_Name = Aaron, Claire, Jacky ; 名字
V_Function = 功能1, 功能2 ; 功能名稱
V_StartTime = %A_Now% ;紀錄開始時間
CoordMode ,Pixel, Screen ;設置座標模式相對於桌面 (整個屏幕)
CoordMode ,Mouse, Screen ;設置滑鼠座標模式相對於桌面 (整個屏幕)
BlockInput ,Mouse
WinWait, 9sPlay - Google Chrome, 
IfWinNotActive, 9sPlay - Google Chrome, , WinActivate, 9sPlay - Google Chrome, 
WinWaitActive, 9sPlay - Google Chrome, 
Loop, Parse, V_Game, `, ;用 "," 解析 V_Game 字串並計算切割後的字串數量
 {
 V_GameNum =%A_Index%
 }
Loop, Parse, V_Name, `, ;用 "," 解析 V_Name 字串並計算切割後的字串數量
 {
 V_NameNum =%A_Index%
 }
Loop, Parse, V_Function, `, ;用 "," 解析 V_Function 字串並計算切割後的字串數量
 {
 V_FunctionNum =%A_Index%
 }
V_ActionNum := V_GameNum*(V_NameNum+V_FunctionNum) ;計算動作數量
Gui, Color, White ;GUI顏色設定為白色
Gui, Add, Text, W600, 新增項目:%V_Game%`r`n`r`n人員:%V_Name%`r`n`r`n功能:%V_Function%`r`n ;新增本次工作內容文字
Gui, Add, Progress, vV_MyProgress w600 ;新增進度條至變量 V_MyProgress (在字母 V 後指定一個變量名, 此變量將為全局變量)
Gui, Add, Text, vV_MyText W600 Right  ;新增文字至變量 V_MyText (在字母 V 後指定一個變量名, 此變量將為全局變量)
Gui +Resize +MaxSize640x480 +AlwaysOnTop -SysMenu ;GUI設定尺寸、保持最上層、去掉系統選單
Gui, Show, X-900 Y300 NoActivate, %V_PluginName% %V_Version% ;NoActivate 讓當前活動窗口繼續保持活動狀態
Loop, Parse, V_Game, `, ;用 "," 解析 V_Game 字串並執行本次工作內容
 {
 V_CurrentTime = %A_Now% ;紀錄當前時間
 EnvSub, V_CurrentTime, %V_StartTime%, S ;以秒計算總共花了多少時間,並更新至 V_CurrentTime
 V_EstimateTime := (V_CurrentTime//(A_Index)-1)*V_GameNum ;預測時間公式:(當前時間 V_CurrentTime//第 A_Index 個項目-1)*V_GameNum. (//)表示為向下捨除
 V_ProgressPercentage := (A_Index/V_GameNum)*100 ;進度百分比公式:(A_Index 當前進度數/V_GameNum 總遊戲數)*100
 GuiControl,, V_MyProgress, %V_ProgressPercentage% ;更新進度條
  if A_Index <= 1
  {
  GuiControl,, V_MyText, 目前執行到第%A_Index%/%V_GameNum%個項目"%A_LoopField%",已使用時間計算中,預期時間計算中 ;更新進度文字至變量 V_MyText
  Gosub, L_AutoAction ;開權限主要動作
  }
 else
  {
  GuiControl,, V_MyText, 目前執行到第%A_Index%/%V_GameNum%個項目"%A_LoopField%",已使用%V_CurrentTime%秒,預期使用%V_EstimateTime%秒 ;更新進度文字
  Gosub, L_AutoAction ;開權限主要動作
  }
 }
V_CurrentTime = %A_Now% ;紀錄結束時間
EnvSub, V_CurrentTime, %V_StartTime%, S ;計算總共花了多少時間
MsgBox, 262144, %V_PluginName% %V_Version%, 新增項目:%V_Game%`r`n`r`n人員:%V_Name%`r`n`r`n功能:%V_Function%`r`n`r`n太棒了!你又節省了%V_CurrentTime%秒!
Gui,Destroy
FileAppend, %A_YYYY%/%A_MM%/%A_DD% %A_Hour%:%A_Min%:%A_Sec%`, %V_Version% save action`,%V_ActionNum% `, and time(second)`, %V_CurrentTime%`n, %A_ScriptDir%\9SplayBackgroundPluginLog.txt ;輸出日誌
Run, %A_ScriptDir%\9SplayBackgroundPluginLog.txt ;開啟日誌
Return

L_SaveFind1: ;搜尋字串後尋找搜尋色塊
OldClip = %Clipboard% ;把目前的剪貼簿內容先存起來
Clipboard = %A_LoopField% ;將字串替換至剪貼簿
Sleep, 300
send, ^f ;搜尋字串
Sleep, 300
send, ^v ;貼上複製內容
Sleep, 700
PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -746, -897, -36, 300, 0x3296FF, 3, Fast ;尋找搜尋色塊
Return

L_SaveFind2: ;點擊座標修正後的勾選框
Sleep, 300
mousemove,  %V_NewColorCoordinateX%, %V_NewColorCoordinateY%
Mouseclick, Left, %V_NewColorCoordinateX%, %V_NewColorCoordinateY% ;點擊座標修正後的勾選框
Sleep, 300
Clipboard = %OldClip% ;恢復先前剪貼簿內容
Return

L_AutoAction: ;開權限主要動作
Mouseclick, Left,  -924,  -871, , 1 ;點項目選單
Sleep, 300
Send, %A_LoopField%{ENTER}
Sleep, 700
Loop ;判斷讀取條是否還在
 {
 PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -999, 710, -989, 715, 0xFFFFFF, 3, Fast ;搜尋白色底色
 if ErrorLevel ;如果讀取條還在
  {
  Sleep, 300
  }
 else
  {
  Loop, Parse, V_Name, `, ;用 "," 解析 V_Name 字串後搜尋,並點擊座標修正後的勾選框
   {
   Gosub L_SaveFind1
   V_NewColorCoordinateX := V_ColorCoordinateX-62 ;名字座標修正
   V_NewColorCoordinateY := V_ColorCoordinateY+5 ;名字座標修正
   Gosub L_SaveFind2
   }
  Loop, Parse, V_Function, `, ;用 "," 解析 V_Function 字字串後搜尋,並點擊座標修正後的勾選框
   {
   Gosub L_SaveFind1
   V_NewColorCoordinateX := V_ColorCoordinateX-42 ;功能座標修正
   V_NewColorCoordinateY := V_ColorCoordinateY+5 ;功能座標修正
   Gosub L_SaveFind2
   }
  PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -746, -897, -36, 300, 0xDEC05B, 3, Fast ;搜尋確定更改
  V_NewColorCoordinateX := V_ColorCoordinateX+25 ;確定更改座標修正
  V_NewColorCoordinateY := V_ColorCoordinateY+10 ;確定更改座標修正
  Sleep, 300
  Mouseclick, Left, %V_NewColorCoordinateX%,%V_NewColorCoordinateY% ;點確定更改
  Break
  }
 }
Loop ;判斷修正完成蓋台還沒出現
 {
 PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -999, 710, -989, 715, 0x7F7F7F, 3, Fast ;搜尋灰色蓋台色
 if ErrorLevel ;如果修正完成蓋台還沒出現
  {
  Sleep, 300
  }
 else
  {
  Mouseclick, Left, -924,  -855, , 3 ;把蓋台按掉
  Sleep, 1000
  Break
  }
 }
Return