3,055
社区成员
发帖
与我相关
我的任务
分享
... ...
hr = spFormElement->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (hr == S_OK)
{
// Find the connection point.
hr = pCPC->FindConnectionPoint( DIID_HTMLFormElementEvents , &pCP);
if (hr == S_OK)
{
// Advise the connection point.
hr = pCP->Advise((IUnknown*)&pOnWebEvent, &dwCookie);
if ( FAILED( hr ) ) ::AfxMessageBox("bbb");
}
pCPC->Release();
}
//----------------------------------------------------------------------------------
//枚举表单中的元素,找到与input 有关的项,如果发现为 image 类型的按钮,就点击。
CComQIPtr< IHTMLElement > spAllInputElement;
spFormElement->QueryInterface( IID_IHTMLElement , (void**)&spAllInputElement );
CComQIPtr< IDispatch > spCollDisp;
CComQIPtr< IHTMLElementCollection > spCollElement;
spAllInputElement->get_all( (IDispatch**)&spCollDisp );
spCollDisp->QueryInterface( IID_IHTMLElementCollection , (void**)&spCollElement );
long nCollCount = 0;
spCollElement->get_length(&nCollCount);
for( long i = 0 ; i< nCollCount ; i++ )
{
CComQIPtr< IDispatch > MyDisp;
CComQIPtr< IHTMLInputElement > spInputElement;
hr = spCollElement->item( CComVariant(i) , CComVariant() , &MyDisp );
if ( FAILED( hr ) ) continue;
if( !MyDisp )//容错
return;
hr = MyDisp->QueryInterface( IID_IHTMLInputElement , (void**)&spInputElement );
if ( FAILED( hr ) ) continue;
if( !strnicmp(lpType , "image" , 5) )//如果发现 为 image 类型的按钮就点击之
{
CComQIPtr< IHTMLElement > spSingleElement;
hr = spInputElement->QueryInterface( IID_IHTMLElement , (void**)&spSingleElement);
if( FAILED( hr ) ) continue;
hr = spSingleElement->click();
if( FAILED( hr ) ) continue;
}
class COnWebEvent : public IDispatch// , public CCmdTarget
{
public:
COnWebEvent():m_dwRef(1)
{};
~COnWebEvent(){};
//HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
// /* [out] */ UINT *pctinfo);
//HRESULT STDMETHODCALLTYPE GetTypeInfo(
// /* [in] */ UINT iTInfo,
// /* [in] */ LCID lcid,
// /* [out] */ ITypeInfo **ppTInfo);
//HRESULT STDMETHODCALLTYPE GetIDsOfNames(
// /* [in] */ REFIID riid,
// /* [size_is][in] */ LPOLESTR *rgszNames,
// /* [in] */ UINT cNames,
// /* [in] */ LCID lcid,
// /* [size_is][out] */ DISPID *rgDispId);
//virtual HRESULT STDMETHODCALLTYPE Invoke(
// /* [in] */ DISPID dispIdMember,
// /* [in] */ REFIID riid,
// /* [in] */ LCID lcid,
// /* [in] */ WORD wFlags,
// /* [out][in] */ DISPPARAMS *pDispParams,
// /* [out] */ VARIANT *pVarResult,
// /* [out] */ EXCEPINFO *pExcepInfo,
// /* [out] */ UINT *puArgErr);
DWORD m_dwRef;
// IUnknown
STDMETHOD(QueryInterface)(const struct _GUID &riid,void ** ppv){
*ppv = NULL;
if (IID_IUnknown == riid)
{
*ppv = (LPUNKNOWN)this;
AddRef();
return NOERROR;
}
else if (IID_IDispatch == riid)
{
*ppv = (IDispatch*)this;
AddRef();
return NOERROR;
}
else
{
return E_NOTIMPL;
}
}
ULONG __stdcall AddRef(void){
return ++m_dwRef;
}
ULONG __stdcall Release(void){
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
// IDispatch
STDMETHOD(GetTypeInfoCount)(unsigned int *){
TRACE("GetTypeInfoCount\n"); return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(unsigned int,unsigned long,struct ITypeInfo ** ){
TRACE("GetTypeInfo\n"); return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(const IID &,LPOLESTR *,UINT,LCID,DISPID *){
TRACE("GetIDsOfNames\n"); return E_NOTIMPL;
}
STDMETHOD(Invoke)(long dispID,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS * pParams,struct tagVARIANT *,struct tagEXCEPINFO *,unsigned int *)
{
return NOERROR;
}
};
//取得表单域,并且点击按钮
CComBSTR vName,vVal,vType;
hr = spInputElement->get_name( &vName );
if( FAILED( hr ) ) continue;
hr = spInputElement->get_value( &vVal );
if( FAILED( hr ) ) continue;
hr = spInputElement->get_type( &vType );
if( FAILED( hr ) ) continue;
if( !strnicmp(lpType , "image" , 5) )//如果发现 为 image 类型的按钮就点击之
{
CComQIPtr< IHTMLElement > spSingleElement;
hr = spInputElement->QueryInterface( IID_IHTMLElement , (void**)&spSingleElement);
if( FAILED( hr ) ) continue;
hr = spSingleElement->click();
if( FAILED( hr ) ) continue;
}
CComQIPtr< IDispatch > pDisp;
hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );
if ( FAILED( hr ) ) continue;
if( !pDisp )//容错
return;
CComQIPtr< IHTMLFormElement > spFormElement = pDisp;
class COnWebEvent : public IDispatch
{
public:
virtual ULONG STDMETHODCALLTYPE AddRef()
{
return 1;
}
virtual ULONG STDMETHODCALLTYPE Release()
{
return 1;
}
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID* ppvObj)
{
if (iid==__uuidof(IDispatch) || iid==__uuidof(IUnknown))
{
if (ppvObj)
*ppvObj = this;
return S_OK;
}
return E_NOINTERFACE;
}
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT * /*pctinfo*/)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT /*iTInfo*/, LCID /*lcid*/, ITypeInfo ** /*ppTInfo*/)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID /*riid*/, LPOLESTR * /*rgszNames*/, UINT /*cNames*/, LCID /*lcid*/, DISPID * /*rgDispId*/)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
// do something
// 在这里设置断点试试
return hr;
}
};