ComObjConnect()

AutoHotKey

ComObjConnect() [AHK_L 53+]

链接对象的事件到给定的前缀名的响应函数.

ComObjConnect(ComObject [, Prefix])

参数

ComObject

产生事件的对象.

如果对象不支持 IConnectionPointContainer 接口,或,无法获取对象类的类型信息,将显示一条错误信息.可通过 ComObjErrortry/catch 禁止或处理此错误信息.

[v1.1.22]+ 中,如果对象支持,使用 IProvideClassInfo 接口以接收此对象类的类型信息.否则, ComObjConnect 尝试通过对象的 IDispatch 接口以接收类型信息,这可能不可靠.

Prefix

用于确定当事件发生时应调用哪个函数,此字符串为事件名称 (EventName) 对应的前缀 (Prefix) .

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

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

用法

在脚本中编写处理所需事件的函数.这类函数或"事件处理程序"具有下列结构:

PrefixEventName([Params..., ComObject])
{
    ... event-handling code ...
    return returnValue
}

Prefix 前缀 为用户定义;而 EventName 事件名称 为期望此函数响应的事件名称,定义于产生事件的对象.

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

注意,事件处理程序可以产生返回值.要返回特定的 COM 类型的值,使用 ComObject(类型, 值). 例如, return ComObject(0,0) 返回类型为 VT_EMPTY 的变量,其等效于从 JavaScript 函数中返回 undefined(或未返回).

调用 ComObjConnect(目标对象, "Prefix") 以启用事件处理.

调用 ComObjConnect(目标对象) 以断开对象(停止事件处理).

如果参数的数目未知,可用 可变参数函数.

相关

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

示例

ie := ComObjCreate("InternetExplorer.Application")

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

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

IE_DocumentComplete(ieEventParam, url, ieFinalParam) {
    global ie
    if (ie != ieEventParam)
        s .= "第一个参数是新的包装器对象.`n"
    if (ie == ieFinalParam)
        s .= "最后一个参数是原始包装器对象.`n"
    if ((disp1:=ComObjUnwrap(ieEventParam)) == (disp2:=ComObjUnwrap(ieFinalParam)))
        s .= "两个包装器对象均引用同一个IDispatch实例.`n"
    ObjRelease(disp1), ObjRelease(disp2)
    MsgBox % s . "完成载入" ie.Document.title " @ " url
    ie.Quit()
    ExitApp
}