http://www.softwelt.com/Know/KnowDetail-3741596.html
如何在htmlview中触发页面中的按钮?
请问:
如何在HTMLVIEW中触发页面中的按钮?
如何能够知道用户点击了页面中的按钮。
如有方法能够达到相同的目的我也给分。
帮忙推者也有分。
如何在HTMLVIEW中触发页面中的按钮?
如何能够知道用户点击了页面中的按钮。
如有方法能够达到相同的目的我也给分。
帮忙推者也有分。
回答(1)
void CHtmlradioselView::submit()
{
LPDISPATCH lpdisp=this->GetHtmlDocument();
IHTMLDocument2* spHtmlDocument=NULL;
HRESULT hr=lpdisp->QueryInterface(IID_IHTMLDocument2,(void**)&spHtmlDocument);
IHTMLElementCollection* pColl=NULL;
hr=spHtmlDocument->get_all(&pColl);
if(pColl!=NULL&&SUCCEEDED(hr))
{
LPDISPATCH pdisp=NULL;
IHTMLInputElement* pelem=NULL;
long num=0;
pColl->get_length(&num);
for(int i=0;i<num;i++)
{
hr=pColl->item(COleVariant((short)i),COleVariant((short)i),&pdisp);
if(SUCCEEDED(hr)&&pdisp!=NULL)
{
hr=pdisp->QueryInterface(IID_IHTMLInputElement,(void**)&pelem);
if(SUCCEEDED(hr)&&pelem!=NULL)
{
bool bfind=false;
BSTR bstrtype;
pelem->get_type(&bstrtype);
if(wcsicmp(bstrtype,L"submit")==0)
{
IHTMLElement* petmp =NULL;
pelem->QueryInterface(IID_IHTMLElement,(void**)&petmp);
petmp->click();
petmp->Release();
bfind=true;
}
SysFreeString(bstrtype);
pelem->Release();
if(bfind)
break;
}
pdisp->Release();
}
}
pColl->Release();
}
if(spHtmlDocument!=NULL)
spHtmlDocument->Release();
if(lpdisp!=NULL)
lpdisp->Release();
}
{
LPDISPATCH lpdisp=this->GetHtmlDocument();
IHTMLDocument2* spHtmlDocument=NULL;
HRESULT hr=lpdisp->QueryInterface(IID_IHTMLDocument2,(void**)&spHtmlDocument);
IHTMLElementCollection* pColl=NULL;
hr=spHtmlDocument->get_all(&pColl);
if(pColl!=NULL&&SUCCEEDED(hr))
{
LPDISPATCH pdisp=NULL;
IHTMLInputElement* pelem=NULL;
long num=0;
pColl->get_length(&num);
for(int i=0;i<num;i++)
{
hr=pColl->item(COleVariant((short)i),COleVariant((short)i),&pdisp);
if(SUCCEEDED(hr)&&pdisp!=NULL)
{
hr=pdisp->QueryInterface(IID_IHTMLInputElement,(void**)&pelem);
if(SUCCEEDED(hr)&&pelem!=NULL)
{
bool bfind=false;
BSTR bstrtype;
pelem->get_type(&bstrtype);
if(wcsicmp(bstrtype,L"submit")==0)
{
IHTMLElement* petmp =NULL;
pelem->QueryInterface(IID_IHTMLElement,(void**)&petmp);
petmp->click();
petmp->Release();
bfind=true;
}
SysFreeString(bstrtype);
pelem->Release();
if(bfind)
break;
}
pdisp->Release();
}
}
pColl->Release();
}
if(spHtmlDocument!=NULL)
spHtmlDocument->Release();
if(lpdisp!=NULL)
lpdisp->Release();
}
回答人:
软界网友
我来回答
回答(2)
能不能说明一下。
我把你的代码COPY过来后,报错。
error C2065: 'IHTMLInputElement' : undeclared identifier
我把你的代码COPY过来后,报错。
error C2065: 'IHTMLInputElement' : undeclared identifier
回答人:
软界网友
我来回答
回答(4)
It needs IE55 sdk header and lib, and latest microsoft platform sdk.
Note, new header file and lib should be put before old ones.
VC menu
Tool->Options
Directory tab
configure the "Include files" settings
make sure ../ie55_lib/include is put in the head of the list(otherwise you need to move it up manually)
do the same thing for "library files"
Note, new header file and lib should be put before old ones.
VC menu
Tool->Options
Directory tab
configure the "Include files" settings
make sure ../ie55_lib/include is put in the head of the list(otherwise you need to move it up manually)
do the same thing for "library files"
回答人:
软界网友
我来回答
回答(8)
在你的stdafx.h里加上下面这行:
#import "c:/windows/system/mshtml.tlb" no_namespace rename("UINT_PTR","wbUINT_PTR") rename("IHTMLControlElement","wbIHTMLControlElement")
编译后可以自动导入mshtml的类库,其实htmlview就是封装的mshtml啦。
你需要学习一些DHTML的知识,MSDN里是用VBScript描述的
Document.form1.button.OnClick就是click button了
至于捕获事件需要使用Sink或者ActiveX组件连接
Sink的好处是不需要额外的DLL组件,但作起来复杂
下面spDoc是GetDocument得到的IHTMLDocument2
在OnDocumentCompleteWb(LPDISPATCH pDisp, VARIANT FAR* URL) 里面:
try{
IUnknown *pUnk;
HRESULT hr = spDoc->QueryInterface(__uuidof(IConnectionPointContainer),
(void **)&pCPC);
if(FAILED(hr)) return;
hr = pCPC->FindConnectionPoint(__uuidof(HTMLDocumentEvents), &pCP);
pCPC->Release();
if (FAILED(hr)) return;
if(!pDocEvent) {
pDocEvent=new IHTMLDocCon();
pDocEvent->Init(GetSafeHwnd(), WM_USER_WB);
}
hr = pDocEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
if (FAILED(hr)) return;
hr = pCP->Advise(pUnk, &dwConnEvt);
pCP->Release();
pDocEvent->Release();
if (FAILED(hr)) return;
}catch(...){
}
pDocEvent就是你作的sink,基类是HTMLDocumentEvents,主要需要实现Invoke方法:
switch(dispIdMember){
case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
vRet=onclick();
vRet.ChangeType(VT_BOOL);
break;
.............
这里就是实现的捕获点击事件,用个方法,比如sendmessage传回主windows,然后:得到事件类型和事件源:
IHTMLWindow2Ptr curWin=spDoc->GetparentWindow();
IHTMLEventObjPtr event=curWin->Getevent();
IHTMLElementPtr ele=event->GetsrcElement();
然后你就处理吧。
另外一种方法比较简单,是做个activex dll,用向导就成,做个class, 有个
#import "c:/windows/system/mshtml.tlb" no_namespace rename("UINT_PTR","wbUINT_PTR") rename("IHTMLControlElement","wbIHTMLControlElement")
编译后可以自动导入mshtml的类库,其实htmlview就是封装的mshtml啦。
你需要学习一些DHTML的知识,MSDN里是用VBScript描述的
Document.form1.button.OnClick就是click button了
至于捕获事件需要使用Sink或者ActiveX组件连接
Sink的好处是不需要额外的DLL组件,但作起来复杂
下面spDoc是GetDocument得到的IHTMLDocument2
在OnDocumentCompleteWb(LPDISPATCH pDisp, VARIANT FAR* URL) 里面:
try{
IUnknown *pUnk;
HRESULT hr = spDoc->QueryInterface(__uuidof(IConnectionPointContainer),
(void **)&pCPC);
if(FAILED(hr)) return;
hr = pCPC->FindConnectionPoint(__uuidof(HTMLDocumentEvents), &pCP);
pCPC->Release();
if (FAILED(hr)) return;
if(!pDocEvent) {
pDocEvent=new IHTMLDocCon();
pDocEvent->Init(GetSafeHwnd(), WM_USER_WB);
}
hr = pDocEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
if (FAILED(hr)) return;
hr = pCP->Advise(pUnk, &dwConnEvt);
pCP->Release();
pDocEvent->Release();
if (FAILED(hr)) return;
}catch(...){
}
pDocEvent就是你作的sink,基类是HTMLDocumentEvents,主要需要实现Invoke方法:
switch(dispIdMember){
case DISPID_HTMLDOCUMENTEVENTS_ONCLICK:
vRet=onclick();
vRet.ChangeType(VT_BOOL);
break;
.............
这里就是实现的捕获点击事件,用个方法,比如sendmessage传回主windows,然后:得到事件类型和事件源:
IHTMLWindow2Ptr curWin=spDoc->GetparentWindow();
IHTMLEventObjPtr event=curWin->Getevent();
IHTMLElementPtr ele=event->GetsrcElement();
然后你就处理吧。
另外一种方法比较简单,是做个activex dll,用向导就成,做个class, 有个
回答人:
软界网友
我来回答
回答(13)
理论上不需要安装SDK,装SDK目的是导出类库。
导入MSHTML就能导入足够的头文件了。
加上那句编译没问题吧?我可是从以前的工程里copy的
但有些常量还是需要装sdk的,需要那些头文件。
导入MSHTML就能导入足够的头文件了。
加上那句编译没问题吧?我可是从以前的工程里copy的
但有些常量还是需要装sdk的,需要那些头文件。
回答人:
软界网友
我来回答
回答(15)
Install the following
microsoft SDK
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
IE55 sdk
http://msdn.microsoft.com/downloads/samples/internet/libraries/ie55_lib/
microsoft SDK
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
IE55 sdk
http://msdn.microsoft.com/downloads/samples/internet/libraries/ie55_lib/
回答人:
软界网友
我来回答
回答(16)
提示什么错误?我编译怎么没问题,只是有一堆警告错误而已,不用管
如果是符号冲突的话,就在#import后增加 rename参数,比如:
rename("UINT_PTR","wbUINT_PTR")
为了去掉警告错误,可以这样:
#pragma warning( push )
#pragma warning(disable : 4099 4192 4146)
#import "c:/windows/system/mshtml.tlb" no_namespace rename("UINT_PTR","wbUINT_PTR") /
rename("IHTMLControlElement","wbIHTMLControlElement")
#pragma warning( pop )
如果是符号冲突的话,就在#import后增加 rename参数,比如:
rename("UINT_PTR","wbUINT_PTR")
为了去掉警告错误,可以这样:
#pragma warning( push )
#pragma warning(disable : 4099 4192 4146)
#import "c:/windows/system/mshtml.tlb" no_namespace rename("UINT_PTR","wbUINT_PTR") /
rename("IHTMLControlElement","wbIHTMLControlElement")
#pragma warning( pop )
回答人:
软界网友
我来回答
回答(18)
确定"c:/windows/system/mshtml.tlb"是否存在
如果是w2000或NT,在系统的system32下有该文件,
直接引入mshtml.tlb也一样。
如果是w2000或NT,在系统的system32下有该文件,
直接引入mshtml.tlb也一样。
回答人:
软界网友
我来回答
回答(21)
在你自己的类中重载CHtmlView的虚函数
virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,LPCTSTR lpszHeaders, BOOL* pbCancel);
按钮所指的URL就放在lpszURL中,根据它你就可以知道是哪个按钮了。
virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,LPCTSTR lpszHeaders, BOOL* pbCancel);
按钮所指的URL就放在lpszURL中,根据它你就可以知道是哪个按钮了。
回答人:
软界网友
我来回答
相关问题