最近在搞雲端主機下單,一直卡在離線桌面執行script的問題。
主要是HTS執行時必須自行輸入密碼才能登入執行,但是使用windows RDP遠端桌面離開時,他會自動鎖住畫面(locked windows),導致AutoIt執行Send鍵盤控制和滑鼠Click失效,而無法登入HTS。
--
官方Q&A如下: https://www.autoitscript.com/wiki/FAQ#Why_doesn.27t_my_script_work_on_a_locked_workstation.3F
--
Why doesn't my script work on a locked workstation?
On a locked station any window will never be active (active is only dialog with text "Press Ctrl+Alt+Del"). In Windows locked state applications run hidden (behind that visible dialog) and do not have focus and active status. So generally don't use Send() MouseClick() WinActivate() WinWaitActive() WinActive() etc. Instead use ControlSend() ControlSetText() ControlClick() WinWait() WinExists() WinMenuSelectItem() etc. This way you may have your script resistive against another active windows. It's possible to run such a script from scheduler on locked Windows stations.
--
Windows在鎖住的情況下,執行的程式會變成背景執行,因此沒有focus和active的狀態。所以無法使用Send()、MouseClick()、WinActivate() 、WinWaitActive()、WinActive() Function。必須使用更精準的Function取代,ControlSend()、ControlSetText()、ControlClick()、WinWait() WinExists()、WinMenuSelectItem()。
--
找到相關討論,有人建議使用VNC等其他斷線時不會強制鎖定螢幕的遠端連線軟體,我本身嘗試Splash Top則是可以正常執行AutoIt Script。
--
另外找到一篇不錯的中文心得,轉載如下
轉自 http://blog.pulipuli.info/2011/05/autoitcontrolsendcontrolclick.html
--
桌面離線也可動作的AutoIt指令:ControlSend跟ControlClick
使用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
對指定視窗中的指定元件輸出鍵盤的指令。
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方法
開啟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的價值吧。
--