在 AHK 以 Acc 控制 Chrome 裡的物件

之前有用 AutoHotKey 在網頁裡填寫表單資料,只是很簡單的 Send 文字,Tab 改變輸入格,Space 勾選 checkbox,然後再 Enter submit 表單,但不知道從哪一版的 Chrome 開始,沒辦法用 space 鍵來 toggle checkbox,只好每次勾選完後再手動送出,很不方便。

一開始想查有沒有其他鍵盤快速鍵可以 toggle checkbox, 查到的都是舊方法已經失效,後來發現這篇 “Re: Check if the checkbox is checked (in chrome)“,看到解決的契機,如果能用 AHK 來控制網頁裡的元件,除了能解決 toggle checkbox 的問題,還可以精準填寫資料到正確的 <input> 裡,不需預先點選輸入格,或點錯格造成自動化失敗。

要用 AHK 來控制一般 Win32 的程式可以透過 Microsoft Active Accessibility (MSAA) (Acc) 的機制,可先參見 jeeswg’s Acc tutorial, 但這個 tutorial 裡 Acc library 還不能 access 到 Chrome 網頁裡的物件,原因是 Chrome 預設是沒有開啟 Acc 的功能,第一次使用時要送一個 Window mwssage 開啟,讓它可以從 path 取物件。

SendMessage, WM_GETOBJECT := 0x003D, 0, 1, Chrome_RenderWidgetHostHWND1, % "ahk_id " hWnd

第一個連結裡提供新版的 Acc viewer 已經處理了這個部份,可以找到網頁裡物件的 path,之後再用 Acc_Get() 來 access。如果要檢查 default action 或是其他 property,這會隨著系統語系改變,也是可用 Acc viewer 查看。

但送了 WM_GETOBJECT 初次 enable 後還是不會自動建立網頁裡物件的 path, 所以第一次還要先遞迴地把所有 Acc children 跑過一遍,之後要再取用就不需要了。

GoThroughAcc(oAcc) {  
  try oAcc["accName"](0)
  for k, v in Acc_Children(oAcc)
    GoThroughAcc(v)
}


Leave a Reply