最近幫朋友搞一個東西, 用 ahk 做的殼(全屏無標題置頂視窗, 用 ahk 比較容易實現), 內容是載入的 html (裡麵包括一些 flash, 和 flash 與 html 的通訊), 但這都不是要說的重點, 重點是後來要求 html(js/flash) 控制關閉 ahk, 這個需求難著了我了, 一直沒想到如何?.
今天無意間又看了一下 ahk 協助文檔關於 activeX 的部分, 發現例子裡有關於用 ComObjConnect 處理對象公開事件的方法, 於是想到了一個比較巧妙的方法, 實現非常簡單, 以至雩都不好意思寫一篇文章來介紹這個方法, 但還是記錄一下, 因為確實很好用.
ahk 代碼:
#NoEnv#SingleInstance focusGui, Add, ActiveX, w700 h400 vWB, Shell.ExplorerWB.Navigate(A_ScriptDir . "\index.html"); 重點來了ComObjConnect(WB, WB_events) Gui, ShowReturnclass WB_events{ ; 處理方法, 當然也可以監聽其他事件 ; 參考: http://msdn.microsoft.com/en-us/library/aa768334 NavigateComplete2(wb, url) { ; 用 SplitPath 簡單解析一下很方便 SplitPath, url, fullCmd, DISCARD, opt, cmd if (cmd == "test") { traytip, Test, This is "test" command. } else if (cmd == "__CLOSE__" ) { ExitApp } else { traytip, %fullCmd%, cmd: %cmd%`, opt: %opt% } }}GuiEscape:GuiClose:exitapp
html 代碼:
<ul> <li ><a href="test" target="_cp" >test</a></li> <li ><a href="command.options" target="_cp" >aaa.bbb</a></li> <li ><a href="__CLOSE__" target="_cp" >close</a></li></ul><iframe name="_cp" src="about:blank" style="display:none;"></iframe>
簡要說明:
其實就是在 html 裡放一個用來接收"命令" 的 iframe, 將需要發送的"命令"寫在連結上, ahk 中監聽 NavigateComplete2 事件, 處理函數中解析 url (格式自己隨便定義了, 我想到個簡單規則就是 command.options, 這樣很容易利用 SplitPath 方法把各部分解析出來加以利用, 接下來做什麼就全交給 ahk 了