如何在htmlview中触发页面中的按钮?

http://www.softwelt.com/Know/KnowDetail-3741596.html

如何在htmlview中触发页面中的按钮?
请问:
如何在HTMLVIEW中触发页面中的按钮?
如何能够知道用户点击了页面中的按钮。
如有方法能够达到相同的目的我也给分。
帮忙推者也有分。
提问时间: 2002-3-12 14:35:11 回答次数: (23) 提问人: 软界网友  我来回答
回答(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();

}
回答人: 软界网友  我来回答
回答(2)
能不能说明一下。
我把你的代码COPY过来后,报错。
error C2065: 'IHTMLInputElement' : undeclared identifier
回答人: 软界网友  我来回答
回答(3)
少头文件吧

msdn
回答人: 软界网友  我来回答
回答(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"
回答人: 软界网友  我来回答
回答(5)
IE55 SDK 是否需要单独安装。是不是安装了IE5.5就可以?
如果需要单独安装那里有下载。
我现在用的是IE6。
回答人: 软界网友  我来回答
回答(6)
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
回答人: 软界网友  我来回答
回答(7)
to:
jiangsheng
有好多啊,到底是哪一个?
回答人: 软界网友  我来回答
回答(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, 有个
回答人: 软界网友  我来回答
回答(9)
Internet Development SDK
回答人: 软界网友  我来回答
回答(10)
多谢各位,我去试试,等一下结。
回答人: 软界网友  我来回答
回答(11)
to: flywhc(午夜蓝调)
你说的方法要安装SDK吗?
我试了,好像不行。
我是指在STDAFX.H中增加你说的那句语句的。
回答人: 软界网友  我来回答
回答(12)
就用IHTMLElement::click就可以了
回答人: 软界网友  我来回答
回答(13)
理论上不需要安装SDK,装SDK目的是导出类库。
导入MSHTML就能导入足够的头文件了。
加上那句编译没问题吧?我可是从以前的工程里copy的

但有些常量还是需要装sdk的,需要那些头文件。
回答人: 软界网友  我来回答
回答(14)
to: flywhc(午夜蓝调)
我说的就是编译过不去。
可能是什么原因?
回答人: 软界网友  我来回答
回答(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/
回答人: 软界网友  我来回答
回答(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 )
回答人: 软界网友  我来回答
回答(17)
不是警告,是error。
和没有加一样。
回答人: 软界网友  我来回答
回答(18)
确定"c:/windows/system/mshtml.tlb"是否存在
如果是w2000或NT,在系统的system32下有该文件,
直接引入mshtml.tlb也一样。
回答人: 软界网友  我来回答
回答(19)
不好意思,写错了。
是直接引入mshtml.dll也一样
回答人: 软界网友  我来回答
回答(20)
向各位大侠学习,收藏(在我机器上论坛收藏功能用不了)
回答人: 软界网友  我来回答
回答(21)
在你自己的类中重载CHtmlView的虚函数
virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,LPCTSTR lpszHeaders, BOOL* pbCancel);
按钮所指的URL就放在lpszURL中,根据它你就可以知道是哪个按钮了。
回答人: 软界网友  我来回答
回答(22)
谢谢大家,我试成功了。给分了。
回答人: 软界网友  我来回答
相关问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值