;activex gui 2 - test joedf - 2014/09/19
;http://ahkscript.org/boards/viewtopic.php?f=7&t=4588&p=26809#p26809
;~ >Read & Write> AHK
;~ AHK >> WebPage
#SingleInstance, off
OnExit,OnExit
HTML_page =
( Ltrim Join
Hello World
)
Gui Add, ActiveX, x0 y0 w640 h480 vWB, Shell.Explorer ; The final parameter is the name of the ActiveX component.
WB.silent := true ;Surpress JS Error boxes
Display(WB,HTML_page)
;Wait for IE to load the page, before we connect the event handlers
while WB.readystate != 4 or WB.busy
sleep 10
;Use DOM access just like javascript!
MyButton1 := wb.document.getElementById("MyButton1")
MyButton2 := wb.document.getElementById("MyButton2")
MyButton3 := wb.document.getElementById("MyButton3")
ComObjConnect(MyButton1, "MyButton1_") ;connect button events
ComObjConnect(MyButton2, "MyButton2_")
ComObjConnect(MyButton3, "MyButton3_")
Gui Show, w640 h480
return
GuiClose:
ExitApp
OnExit:
FileDelete,%A_Temp%*.DELETEME.html ;clean tmp file
ExitApp
; Our Event Handlers
MyButton1_OnClick() {
global wb
MsgBox % wb.Document.getElementById("MyTextBox").Value
}
MyButton2_OnClick() {
global wb
FormatTime, TimeString, %A_Now%, dddd MMMM d, yyyy HH:mm:ss
data := "AHK Version " A_AhkVersion " - " (A_IsUnicode ? "Unicode" : "Ansi") " " (A_PtrSize == 4 ? "32" : "64") "bit`nCurrent time: " TimeString
wb.Document.getElementById("MyTextBox").value := data
}
MyButton3_OnClick() {
MsgBox Hello world!
}
;------------------
Display(WB,html_str) {
Count:=0
while % FileExist(f:=A_Temp "" A_TickCount A_NowUTC "-tmp" Count ".DELETEME.html")
Count+=1
FileAppend,%html_str%,%f%
WB.Navigate("file://" . f)
}
html 与 ahk 伪通信
最近帮朋友搞一个东西, 用 ahk 做的壳(全屏无标题置顶窗口, 用 ahk 比较容易实现), 内容是加载的 html (里面包括一些 flash, 和 flash 与 html 的通信), 但这都不是要说的重点, 重点是后来要求 html(js/flash) 控制关闭 ahk, 这个需求难着了我了, 一直没想到如何实现.
今天无意间又看了一下 ahk 帮助文档关于 activeX 的部分, 发现例子里有关于用 ComObjConnect 处理对象公开事件的方法, 于是想到了一个比较巧妙的方法, 实现非常简单, 以至于都不好意思写一篇文章来介绍这个方法, 但还是记录一下, 因为确实很好用.
ahk 代码:
1. #NoEnv
2. #SingleInstance focus
3.
4. Gui, Add, ActiveX, w700 h400 vWB, Shell.Explorer
5. WB.Navigate(A_ScriptDir . "index.html")
6. ; 重点来了
7. ComObjConnect(WB, WB_events)
8.
9. Gui, Show
10.
11. Return
12.
13. class WB_events
14. {
15. ; 处理方法, 当然也可以监听其他事件
16. ; 参考: http://msdn.microsoft.com/en-us/library/aa768334
17. NavigateComplete2(wb, url)
18. {
19. ; 用 SplitPath 简单解析一下很方便
20. SplitPath, url, fullCmd, DISCARD, opt, cmd
21.
22. if (cmd == "test")
23. {
24. traytip, Test, This is "test" command.
25. }
26. else if (cmd == "__CLOSE__" )
27. {
28. ExitApp
29. }
30. else
31. {
32. traytip, %fullCmd%, cmd: %cmd%`, opt: %opt%
33. }
34. }
35. }
36.
37. GuiEscape:
38. GuiClose:
39. exitapp
html 代码:
1.
2. - test
3. - aaa.bbb
4. - close
5.
6.
7.
简要说明:
其实就是在 html 里放一个用来接收”命令” 的 iframe, 将需要发送的”命令”写在链接上, ahk 中监听 NavigateComplete2 事件, 处理函数中解析 url (格式自己随便定义了, 我想到个简单规则就是 command.options, 这样很容易利用 SplitPath 方法把各部分解析出来加以利用, 接下来做什么就全交给 ahk 了 😉
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net