以设置Onclick为例,HRESULT IHTMLElement::put_onclick(VARIANT v)和HRESULT attachEvent( BSTR event,IDispatch * pDisp,VARIANT_BOOL * pfResult)都可以设置响应函数。但必须找到响应函数的IDispatch 。
msdn上有
HRESULT IHTMLDocument::get_Script(IDispatch **p);
可以获得script的IDispatch,再往下就只能用IDispatch的Invoke()来执行script中的函数。达不到目的。网上找了些相关的例子,都是采用的方法子类化IDispatch的方法。如下:
pClickEvent = new CClickEvent ; //CClickEvent是自己实现的IDispatch子类
VARIANT vDocDisp;
vDocDisp.vt = VT_DISPATCH;
vDocDisp.pdispVal = pClickEvent ;
pDoc2->put_onclick( vDocDisp);
将自己写的响应函数体写入重载Invoke()函数就行了。
但这种方法的函数体实现是在vc中实现的,也与目标不符。
无数次的查看msdn,突然发现put_onclick的反面不是get_onclick么。
于是我在网页的开头添加了一个hidden元素
<input type=hidden id="substr" name="hiddenObject" value="" οnclick="clickhand()">
想到了吧,获取了hidden元素onclick响应函数不就是得到了其它网页元素的onclick响应函数了吗。下面是我的代码:
if (m_pBrowser->get_Document( &spDispatch) != S_OK)
return;
spDispatch->QueryInterface(IID_IHTMLDocument3,(void**)&pDoc3);
VARIANT vOnclick;
BSTR bstrid = ::SysAllocString(L"substr");
pDoc3->getElementById(bstrid,&pElement);
pElement->get_onclick(&vOnclick);
这样就获取了onclick的响应函数。
之后就简单啦,假设添加的网页元素是pAddElement,设置它的onclick响应函数只需 pAddElement->put_onclick(vOnclick);