ComObjConnect()

AutoHotkey

ComObjConnect() [AHK_L 53+]

连接对象的事件源到带有给定前缀的函数.

ComObjConnect(ComObject [, Prefix])

参数

ComObject

产生事件的对象.

Prefix

用于确定当事件发生时应调用哪个函数的的事件名称前缀的字符串.

如果省略, 那么对象为 "未连接的"; 即脚本将不再接收其事件通告.

[v1.1.01+]: 此参数可以为脚本定义的对象. 事件发生时, 会调用相应的方法. 首个参数, 通常为隐藏的 this 参数, 引用脚本定义的对象, 而不是 COM 对象. 要不为每个事件定义方法而捕获所有事件, 请定义 __Call 元函数.

用法

要让 ComObjConnect 有意义, 首先您必须在脚本中编写处理任何感兴趣事件的函数. 这类函数或 "事件处理程序" 具有下列结构:

PrefixEventName([Params..., ComObject])
{
    ... 处理事件的代码 ...
    return returnValue
}

Prefix 为您选择的前缀, 而 EventName 为函数需要处理的每种事件的名称.

Params 对应于事件包含的所有参数. 如果事件不含有参数, Params 应该完全省略. ComObject 是可选的, 并且可以在定义的 Params 数目正确时才使用; 它包含了到传递给 ComObjConnect 的原始包装器对象的引用. "ComObject" 应该替换为与您脚本上下文相关的更有意义的名称.

注意事件处理程序可以产生返回值. 要返回特定的 COM 类型的值, 请使用 ComObjParameter, 它也可以写成 ComObjRetVal(type, value) 或简化成 ComObj(type, value).

调用 ComObjConnect(yourObject, "Prefix") 来启用事件处理.

调用 ComObjConnect(yourObject) 来断开到对象的连接 (停止处理事件).

如果参数的数目未知, 那么可以使用 可变参数函数.

相关

ComObjCreate, ComObjGet, ComObjActive, ComObjConnect, ComObjError, WScript.ConnectObject (MSDN)

示例

ie := ComObjCreate("InternetExplorer.Application")

; 把事件连接到带“IE_”前缀的脚本函数。
ComObjConnect(ie, "IE_")

ie.Visible := true  ; 已知此语句在IE7上无法正常执行。
ie.Navigate("http://ahkscript.org/")
#Persistent

IE_DocumentComplete(ieEventParam, url, ieFinalParam) {
    global ie
    if (ie != ieEventParam)
        s .= "First parameter is a new wrapper object.`n"
    if (ie == ieFinalParam)
        s .= "Final parameter is the original wrapper object.`n"
    if ((disp1:=ComObjUnwrap(ieEventParam)) == (disp2:=ComObjUnwrap(ieFinalParam)))
        s .= "Both wrapper objects refer to the same IDispatch instance.`n"
    ObjRelease(disp1), ObjRelease(disp2)
    MsgBox % s . "Finished loading " ie.Document.title " @ " url
    ie.Quit()
    ExitApp
}