使用AutoIt撰寫的機器人可以幫Windows環境下的使用者省下很多手動操作的工作。但是有時候我們不在電腦前,也想要利用AutoIt來在特定時間排程進行工作,這時候就不能用常見的Send、MouseClick的函數(function)指令,而應該要用ControlSend、ControlClick等Control系列的函數,直接對要被控制的對話視窗送出指令。
桌面離線的情況
切換使用者
Windows除了「關機」、「登出」之外,還可以在不關閉現在執行中的程式的情況下,切換成其他使用者,讓其他使用者使用。
上圖是以Windows 7為例,Windows XP也有這個選項,在「開始 > 登出 > 切換使用者」裡面。
遠端桌面連線中斷
另一種情況是遠端桌面連線中,不進行登出或關機,而是直接將遠端桌面連線關閉。這樣子執行中的程式依舊會繼續執行。
AutoIt的Send跟MouseClick無法作用
以前我使用AutoIt來做自動安裝VirtualBox機器人的時候,是在桌面連線的前提下,讓AutoIt模仿使用者的動作,進行Send(模擬鍵盤指令輸入)跟MouseClick(模擬滑鼠按鍵輸入)的動作。
但是在桌面離線的情況下,AutoIt的Send跟MouseClick就會失效,這時候必須改用另外更精確的指定Control系列函數才行。
使用方法
AutoIt中以Control開頭的函數有十幾種,對製作自動操作機器人的我來說,主要使用ControlSend跟ControlClick這兩種。這兩種的使用方法都很類似,以下進一步說明:
對指定視窗中的指定元件輸出鍵盤的指令。
ControlSend ( "title", "text", controlID, "string" [, flag] )
- "title":要控制的視窗標題。不必輸入完整標題,AutoIt只有開頭部分的文字也能搜尋得到。
- "text":要控制的視窗內文。如果沒有內文,可以輸入空字串""。
- controlID:要控制的元件代號。稍後介紹。
- "string":要輸入的指令。指令的內容詳細請參考Send。
- flag:如何處理要輸入的指令。flag = 0(預設),允許指令包含特殊字元;flag = 1,指令以原始資料輸入。這也跟Send是一樣的。
對指定視窗中的指定元件輸出滑鼠點擊的指令。
ControlClick ( "title", "text", controlID [, button [, clicks [, x [, y ]]]] )
"title"、"text"、controlID跟ControlSend是一樣的。其實Control系列函數幾乎都會有這些參數。
以下是其他選擇性的參數。
- button:模擬滑鼠輸出的指令,預設是"left"(滑鼠左鍵),詳細按鍵列表請看ControlClick的說明。
- clicks:要點選的次數,預設是1次。
- x:要點選元件的水平位置,預設是"center"(中間)。
- y:要點選元件的垂直位置,預設是"center"(中間)。
擷取controlID
剛剛提到了Control系列函數中都需要有controlID參數。controlID並不像是title或text可直接從表面觀察判斷,它是軟體設計時的內部代號,對於初次使用Control系列函數的人來說,常常不知道該如何取得controlID。對於這個無法直接觀察的controlID,可以使用AutoIt v3 Window Info工具來擷取。
AutoIt v3 Window Info位置
AutoIt v3 Window Info會隨著AutoIt一同安裝,位於安裝目錄底下。預設安裝位置為:
C:\Program Files\AutoIt3\Au3Info.exe
C:\Program Files\AutoIt3\Au3Info_x64.exe
其中Au3Info_x64.exe是給64位元的作業系統使用的。
擷取controlID方法
開啟AutoIt v3 Window Info(以下簡稱Au3Info)的主視窗之後如上圖。Au3Info會自動維持最上層的狀態。
接著請打開你要指定的視窗,在此我以Windows的「我的文件」對話視窗為例。請把Au3Info中的「Finder Tool」準心拖曳到你要觀察的對話視窗元件,如上圖,我把Finder Tool拖曳到了「我的文件」中的網址輸入元件上,而原本沒有任何資料的Au3Info,這時也顯示出了元件的詳細資料。
在Au3Info眾多資料中,我們需要注意的是Control分頁中的Advanced Mode的值,這就是controlID參數。在此例中,「我的文件」的網址輸入元件,其controlID為"[CLASS:Edit; INSTANCE:1]"(請注意大小寫跟空白喔)。
從Send修改成ControlSend的範例
為了讓大家更好理解Send跟ControlSend的差異,在這邊舉兩個例子來說明。
Send的例子
以下是利用Send來開啟「我的文件」,並將網址切換到「桌面」的例子:
Run("explorer.exe")
WinWait("我的文件")
If Not WinActive("我的文件") Then WinActivate("我的文件")
Send("{ALTDOWN}d{ALTUP}")
Send("{SHIFTDOWN}{END}{SHIFTUP}桌面{Enter}")
這支程式第一行是開啟"explorer.exe",預設啟動時會打開「我的文件」。第二行跟第三行則是等待「我的文件」啟動,並且將它置於焦點。第四行則是跳到網址輸入元件,第五行輸入桌面,最後就能跳到桌面的畫面。
這個例子在桌面連線的情況下可以順利執行,但在桌面離線的情況下,第四行開始將會無法順利執行。
ControlSend的例子
以下是利用ControlSend來開啟「我的文件」,並將網址切換到「桌面」的例子:
Run("explorer.exe")
WinWait("我的文件")
If Not WinActive("我的文件") Then WinActivate("我的文件")
ControlSend("我的文件", "", "[CLASS:Edit;INSTANCE:1]", "{SHIFTDOWN}{END}{SHIFTUP}桌面{Enter}")
這個例子的功能跟前面的例子大致上相同。只有第四行之後改用ControlSend來輸入指令,因此它不僅能夠在桌面連線時執行,也能在桌面離線下執行。
結語
AutoIt的網站不知不覺地更改了網頁設計,害我以為我找錯網站orz
總之,未來有機會再繼續挖掘AutoIt的價值吧。
(more...)
Comments