:::

桌面離線也可動作的AutoIt指令:ControlSend跟ControlClick

image

使用AutoIt撰寫的機器人可以幫Windows環境下的使用者省下很多手動操作的工作。但是有時候我們不在電腦前,也想要利用AutoIt來在特定時間排程進行工作,這時候就不能用常見的SendMouseClick函數(function)指令,而應該要用ControlSendControlClick等Control系列的函數,直接對要被控制的對話視窗送出指令。


桌面離線的情況

切換使用者

image

Windows除了「關機」、「登出」之外,還可以在不關閉現在執行中的程式的情況下,切換成其他使用者,讓其他使用者使用。

上圖是以Windows 7為例,Windows XP也有這個選項,在「開始 > 登出 > 切換使用者」裡面。

遠端桌面連線中斷

image

另一種情況是遠端桌面連線中,不進行登出或關機,而是直接將遠端桌面連線關閉。這樣子執行中的程式依舊會繼續執行。

AutoIt的Send跟MouseClick無法作用

以前我使用AutoIt來做自動安裝VirtualBox機器人的時候,是在桌面連線的前提下,讓AutoIt模仿使用者的動作,進行Send(模擬鍵盤指令輸入)MouseClick(模擬滑鼠按鍵輸入)的動作。

但是在桌面離線的情況下,AutoIt的Send跟MouseClick就會失效,這時候必須改用另外更精確的指定Control系列函數才行。

使用方法

AutoIt中以Control開頭的函數有十幾種,對製作自動操作機器人的我來說,主要使用ControlSend跟ControlClick這兩種。這兩種的使用方法都很類似,以下進一步說明:

ControlSend

對指定視窗中的指定元件輸出鍵盤的指令。

ControlSend ( "title", "text", controlID, "string" [, flag] )
  • "title":要控制的視窗標題。不必輸入完整標題,AutoIt只有開頭部分的文字也能搜尋得到。
  • "text":要控制的視窗內文。如果沒有內文,可以輸入空字串""
  • controlID:要控制的元件代號。稍後介紹。
  • "string":要輸入的指令。指令的內容詳細請參考Send
  • flag:如何處理要輸入的指令。flag = 0(預設),允許指令包含特殊字元;flag = 1,指令以原始資料輸入。這也跟Send是一樣的。
ControlClick

對指定視窗中的指定元件輸出滑鼠點擊的指令。

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方法

image

開啟AutoIt v3 Window Info(以下簡稱Au3Info)的主視窗之後如上圖。Au3Info會自動維持最上層的狀態。

image

接著請打開你要指定的視窗,在此我以Windows的「我的文件」對話視窗為例。請把Au3Info中的「Finder Tool」準心拖曳到你要觀察的對話視窗元件,如上圖,我把Finder Tool拖曳到了「我的文件」中的網址輸入元件上,而原本沒有任何資料的Au3Info,這時也顯示出了元件的詳細資料。

image

在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來輸入指令,因此它不僅能夠在桌面連線時執行,也能在桌面離線下執行。


結語

image

AutoIt的網站不知不覺地更改了網頁設計,害我以為我找錯網站orz

總之,未來有機會再繼續挖掘AutoIt的價值吧。