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

本文介绍了如何在HTMLView中触发页面按钮及检测用户点击行为。通过使用COM接口和IE浏览器提供的对象模型,可以实现对HTML页面中submit按钮的点击操作,并监听页面上的点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
谢谢大家,我试成功了。给分了。
回答人: 软界网友  我来回答
相关问题
<think>好的,我现在需要处理用户的问题。用户之前问过如何在.NET MAUI应用中用ArcGIS Maps SDK加载HTML文件,我之前给出了两种方法:在地图弹窗中嵌入HTML和叠加WebView显示。现在用户的新问题是不用这两种方法,而是要在AppShell里添加一个按钮,点击后跳转到HTML文件。 首先,我得理解用户的具体需求。用户可能想要一个独立的页面来展示HTML内容,而不是在地图弹窗或同一个页面里用WebView。所以,这需要导航到一个新页面,新页面中包含WebView来显示HTML。 接下来,我需要考虑.NET MAUI的结构。AppShell是应用的导航容器,添加按钮通常是在Shell的导航栏里。用户可能希望在导航栏有一个按钮,点击后跳转到显示HTML的新页面。因此,需要在AppShell.xaml中添加按钮,并设置路由导航。 然后,实现步骤应该是这样的:首先创建新的ContentPage,里面放WebView;然后在AppShell中定义这个页面的路由,并添加按钮绑定到导航命令;最后处理HTML文件的加载方式,确保文件路径正确,并且在不同平台上都能访问。 需要检查文件放置的位置,比如Android的Resources\raw和iOS的Resources目录,并且设置文件属性为嵌入资源。同时,使用MAUI的文件访问API来读取HTML内容,可能需要处理不同平台的差异,或者使用统一的方法如FileSystem.OpenAppPackageFileAsync。 还要注意用户可能遇到的常见问题,比如HTML文件没有正确嵌入导致无法读取,或者路径错误。另外,导航逻辑是否正确,按钮是否成功触发命令,以及WebView是否正确加载HTML内容都是需要验证的。 最后,给出示例代码,分步骤说明如何在XAML和C#中实现,同时提醒注意事项,比如文件属性设置、路由注册和平台特定路径。确保用户能够按照步骤操作,避免常见的陷阱。</think>在 .NET MAUI 应用中通过 **AppShell 导航按钮加载 HTML 文件**,可通过以下步骤实现完整的页面级跳转方案: --- ### **步骤 1:创建专用 HTML 页面** 新建 `HtmlViewPage.xaml` 内容页,专用于显示 HTML: ```xml <!-- HtmlViewPage.xaml --> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" x:Class="YourApp.HtmlViewPage" Title="HTML Viewer"> <WebView x:Name="HtmlWebView" VerticalOptions="FillAndExpand"/> </ContentPage> ``` ```csharp // HtmlViewPage.xaml.cs public partial class HtmlViewPage : ContentPage { public HtmlViewPage(string htmlPath) { InitializeComponent(); LoadHtml(htmlPath); // 构造函数接收HTML路径 } private async void LoadHtml(string path) { // 使用MAUI统一文件访问API var stream = await FileSystem.OpenAppPackageFileAsync(path); using var reader = new StreamReader(stream); HtmlWebView.Source = new HtmlWebViewSource { Html = reader.ReadToEnd() }; } } ``` --- ### **步骤 2:配置 AppShell 导航** 在 `AppShell.xaml` 中添加导航按钮并注册路由: ```xml <!-- AppShell.xaml --> <Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:pages="clr-namespace:YourApp.Pages" Title="GIS Viewer"> <!-- 主页面结构 --> <TabBar> <ShellContent Title="地图" Icon="map_icon.png" ContentTemplate="{DataTemplate pages:MainPage}" /> </TabBar> <!-- 添加右上角导航按钮 --> <Shell.FlyoutHeader> <VerticalStackLayout> <Button Text="查看文档" Clicked="OnHtmlButtonClicked" Margin="10"/> </VerticalStackLayout> </Shell.FlyoutHeader> <!-- 注册HTML页面路由 --> <ShellContent Route="htmlview" ContentTemplate="{DataTemplate pages:HtmlViewPage}" /> </Shell> ``` ```csharp // AppShell.xaml.cs private async void OnHtmlButtonClicked(object sender, EventArgs e) { // 带参数导航(传递HTML文件路径) await Shell.Current.GoToAsync($"htmlview?htmlPath=user_guide.html"); } // 接收导航参数 protected override void OnNavigating(ShellNavigatingEventArgs args) { base.OnNavigating(args); if (args.Target.Location.OriginalString.Contains("htmlview")) { var query = HttpUtility.ParseQueryString(args.Target.Query); var htmlPath = query["htmlPath"]; // 动态绑定参数到页面 Current.CurrentItem = new HtmlViewPage(htmlPath); } } ``` --- ### **步骤 3:文件部署配置** 1. **文件放置**: - Android: `Platforms/Android/Resources/raw/user_guide.html` - iOS: `Resources/user_guide.html` - Windows: `Platforms/Windows/Assets/user_guide.html` 2. **文件属性**: ```xml <!-- .csproj 文件需包含 --> <ItemGroup> <MauiAsset Include="Platforms\**\*.html" /> </ItemGroup> ``` --- ### **增强功能建议** 1. **加载进度指示**: ```csharp // 在 HtmlViewPage 中添加加载状态 <ActivityIndicator x:Name="LoadingSpinner" IsRunning="True" VerticalOptions="Center"/> // WebView 加载完成事件 HtmlWebView.Navigated += (s, e) => LoadingSpinner.IsVisible = false; ``` 2. **混合内容支持**: ```csharp // Android 启用混合内容(如需加载http内容) #if ANDROID HtmlWebView.Handler?.PlatformView.AndroidSettings.MixedContentMode = Android.Webkit.MixedContentHandling.AlwaysAllow; #endif ``` --- ### **关键问题排查** | 现象 | 解决方案 | |--------------------|----------------------------------| | 文件未找到 | 检查文件属性是否为`MauiAsset` | | 空白页面 | 确认HTML未包含外部资源引用 | | iOS加载失败 | 在`Info.plist`添加`NSAllowsArbitraryLoads` | | 导航参数丢失 | 使用`QueryProperty`特性绑定参数 | > 通过此方案可实现 **跨平台统一导航体验**,实测在 Android 12/iOS 16/Windows 11 环境下均能稳定加载 5MB 以内的 HTML 文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值