由于项目需要,近来研究了一下WebBrowser组件和MSHTML 在Delphi中的使用,整理了一下这段时间研究的结果,写下来一是方便大家查阅,二也可以加深我自己的记忆.希望能对大家有所帮助…,同时,如果有更好 的处理方式或者我没有提到的问题,请大家也告诉我哦, 咱们一块进步 ...,其中一部分是我从网络中搜集的资料,谢谢那些兄弟们… 
MSHTML把HTML页面中的元素封装成了IHTMLInputElement、 IHTMLInputButtonElement、IHTMLInputTextElement、IHTMLTextAreaElement、 IHTMLTitleElement、IHTMLFormElement等等组件接口。
在程序中可以通过MSHTML提供的IHTMLDocument2接口得到整个Document对象,IHTMLElementCollection接口得到所有页面元素的集合,通过该接口的Item方法可以得到具体的某个组件,然后设置和读取该组件的属性值。
下面是一些常用功能的事例代码.
1. 打开某个页面:
web.Navigate(ExtractFilePath(Application.ExeName) + ’Template/login.html’);
2. 取出页面中某个HtmlElement的Value属性值:
function GetValueByElementName(web: TWebBrowser; elementName: string; index: integer): string;
begin
result := (((web.Document as IHTMLDocument2).body.all as
IHTMLElementCollection).item(elementName, index) as IHTMLInputElement
).value
end;
3. 给HtmlElement设置Value属性
procedure SetValueTextAreaName(web: TWebBrowser; elementName, value: string;index: integer);
begin
(((web.Document as IHTMLDocument2).body.all as
IHTMLElementCollection).item(elementName, index) as IHTMLTextAreaElement
).value := value;
end;
4. 判断页面执行结果是否成功
因为Web应用中如果出错的一般是采用错误页面的方式呈现给最终用户,所以我们也无法抓到Http错误,只能通过在webBeforeNavigate2 事件中将URL参数记录到全局变量中, 然后在webDocumentComplete事件中根据URL参数和全局变量中的URL参数来判断执行结果是否正确.当然,这样需要将页面地址编码到代 码中,降低了灵活性,但是这也是我能想到的唯一的方法,如果大家有什么好的方法,请告诉我哦.
5. 屏蔽鼠标右键和某些快捷键
本功能需要在webBrowser的窗口中加入ApplicationEvents组件,设置它的OnMessage事件代码如下即可.
procedure TwebAdapterForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
const
_KeyPressMask = $80000000;
begin
//禁用右键
with Msg do
begin
if not IsChild(web.Handle, hWnd) then Exit;
Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
end;
//禁止Ctrl + N
//禁止Ctrl + F
//禁止Ctrl + A
if Msg.message = WM_KEYDOWN then
begin
if ((Msg.lParam and _KeyPressMask) = 0) and
(GetKeyState(VK_Control) <0) and ((Msg.wParam = Ord(’N’))
or (Msg.wParam = Ord(’F’)) or (Msg.wParam = Ord(’A’))) then
begin
Handled := True;
end;
end;
end;
6. 在页面关闭的时候,同时关掉包含页面的VCL Form.(仅限 InternetExplorer 6.0)
本功能需要卸载掉Delphi自带的 WebBrowser组件,安装ActionX组件(Microsoft Internet Controls V1.1),而且以后的程序只能运行在安装有Internet Explorer 6.0 的环境下.具体方法如下:
在WebBrowser组件的OnWindowClosing事件中,输入self.close; 代码即可.如果需要阻止窗口的关闭, 设置CanClose参数的值为Flase.
7. 如何将页面中超链接新开的页面窗口包到指定的VCL窗口中.
procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
var
form : TForm1;
begin
form := TForm1.Create(nil);
ppDisp := form.web.DefaultDispatch;
form.Show;
end;
8. 在WebBrowser加载html页面完成后,在页面顶端插入HTML代码, 下面两种方式斗可以. 
{1. ----------------------------------------------------------------} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
Range: IHTMLTxtRange; 
begin 
Range := ((WebBrowser1.Document as IHTMLDocument2).body as 
IHTMLBodyElement).createTextRange; 
Range.collapse(False); 
Range.pasteHTML(’<br/><b>Hello!</b>’); 
end; 
{2. ----------------------------------------------------------------} 
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; 
const pDisp: IDispatch; var URL: OleVariant); 
var 
WebDoc: HTMLDocument; 
WebBody: HTMLBody; 
begin 
WebDoc := WebBrowser1.Document as HTMLDocument; 
WebBody := WebDoc.body as HTMLBody; 
WebBody.insertAdjacentHTML(’BeforeEnd’, ’<h1>Hello World!</h1>’); 
end; 
9. 将页面中显示的内容全部选中,然后粘贴到Word文档中. 
WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);//全选网页 
WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT); //复制网页 
WordDocu.Range.Paste; //word文档粘贴 
WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全选 
注:WebBrowser的Document属性值和WordDocument的Document属性值必须都不为nil. 
10. 如何解决网页不响应回车事件 
public 
{ Public declarations } 
procedure MsgHandle(var Msg :TMsg; var Handled :Boolean); 
end; 
var 
Form1: TForm1; 
FOleInPlaceActiveObject :IOleInPlaceActiveObject; 
implementation 
{$R *.DFM} 
procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean); 
var 
iOIPAO :IOleInPlaceActiveObject; 
Dispatch :IDispatch; 
begin 
if WebBrowser1 =nil then 
begin 
Handled :=False; 
Exit; 
end; 
Handled :=(IsDialogMessage(WebBrowser1.Handle, Msg) =True); 
if (Handled) and (not WebBrowser1.Busy) then 
begin 
if FOleInPlaceActiveObject =nil then 
begin 
Dispatch :=WebBrowser1.Application; 
if Dispatch <>nil then 
begin 
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO); 
if iOIPAO <>nil then 
FOleInPlaceActiveObject :=iOIPAO; 
end; 
end; 
end; 
if FOleInPlaceActiveObject <>nil then 
if ((Msg.message =WM_KEYDOWN) or (Msg.Message =WM_KEYUP)) and ((Msg.wParam =VK_BACK) or (Msg.wParam =VK_LEFT) or (Msg.wParam =VK_RIGHT)) then 
else 
FOleInPlaceActiveObject.TranslateAccelerator(Msg); 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
Application.OnMessage :=MsgHandle; 
end; 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
FOleInPlaceActiveObject :=nil; 
end; 
11. 如何在WebBrowser中调用当前页面中的javascript函数SayHello() 
WebBrowser1.OleObject. 
Document.parentWindow.execScript(’SayHello()’, ’javascript’); 
//or 
(WebBrowser1.Document as IHTMLDocument2 
).parentWindow.execScript(’SayHello()’, ’javascript’) 
//or 
webrowser1.document.script.SayHello(); 

转载于:https://www.cnblogs.com/China-Dragon/archive/2010/05/07/1729351.html

WebBrowser组件和MSHTML相关推荐

  1. C#重写WebBrowser组件,禁止跳转到IE新窗口、脚本错误

    原创地址 刚从delphi转到c#,一切重头开始.上来先做个myBrowser,结果发现无法解决跳转到新窗口问题.从网上找到奇客力大侠的<C# webBrowser禁止在新窗口打开,强制在本窗口 ...

  2. C#WEB项目中使用WebBrowser组件

    1. 在web项目中引用system.windows库: 再在代码中引用:using system.windows.forms 2. 这样在程序中可以使用webbrowser组件了: WebBrows ...

  3. 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式

    IE8 在渲染引擎做了很大的改动,新增加一个标准模式 (Standard Mode). 不少软件都内嵌了IE的WebBrowser控件(也就是MSHTML.dll)来显示网页, 当用户机器升级到IE8 ...

  4. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  5. 用WebBrowser实现HTML界面的应用和交互

    这一篇将继续讨论在使用delphi进行普通应用程序开发的时候,WebBrowser的具体应用,主要是针对使用其进行HTML界面开发的,这也是一篇我在网上找到的资料,大家如要转载,请尊重原作者的知识产权 ...

  6. html页面调用存储过程,用WebBrowser实现HTML界面的应用

    HTML的界面有以下特点:图文混排,格式灵活,可以包含Flash.声音和视频等,实现图文声像的多媒体界面,而且易于建立和维护.另外,HTML的显示环境一般机器上都具备,通常不需要安装额外的软件.当然, ...

  7. Microsoft.mshtml到底是什么?

    MSHTML到底是什么,现在越来越糊涂了. Lostinet在结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序一文给出的例子中引用的是MSHTML(COM组件) ...

  8. 利用WebBrowser获得页面部分数据

    Internet Explorer 不只是一个程序,更是许多可重复使用组件的集合与容器.在拆取 Web 页时,最有意思的两个组件是 shdocvw.dll 和 mshtml.dll.第一个组件 shd ...

  9. webbrowser屏蔽网页弹出框和脚本错误提示框

    1.引用组件using mshtml; 2.添加事件 webBrowser.Navigated += WebBrowser_Navigated; 3.代码 /// <summary> // ...

最新文章

  1. 如何修改可运行Jar包,如何反编译Jar包
  2. 2008最响亮的十二句屁话
  3. uboot2012(一)分析重定位
  4. 统计学---极端异常值的检测
  5. c语言 结构数组读取,有关文件读写到结构体数组问题;
  6. linux内存free低,Linux上的内存使用情况与`free`不匹配
  7. python 内置方法赋值_Python内置数据结构之字符串str
  8. 作者:男,博士,西南财经大学经济数学学院讲师、硕士生导师
  9. ASP.NET的视图(Razor)循环产生html代码
  10. UKIEPC 2017
  11. CentOS安装第三方yum源EPEL
  12. java的property_「propertyutils」java之PropertyUtils - seo实验室
  13. Android应用分类
  14. Python 数据处理与分析(三) 设计一个高回报的投资组合(投资回报和风险分析)任务 2:计算不同类型的收益率和投资组合的收益率
  15. 读书印记 - 《人类的群星闪耀时》
  16. wlan:11a/11b/11g/11n/11ac
  17. Kubernetes——service管理
  18. 解决无公网IP,远程访问黑群晖NAS
  19. 推荐一款免费又好用的报表工具
  20. MVC应用程序使用Web Services(asmx)

热门文章

  1. 如何提升网站在搜索引擎中的排名?
  2. 浅析简易网页制作的准备工作
  3. 制作网站设计项目进度表让用户充分了解网站制作进程
  4. 网站优化靠前排名讲方法
  5. 浅析SEO优化怎样打好企业新站优化基础稳步提升排名
  6. ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...
  7. hashmap允许null键和值吗_hashMap底层源码浅析
  8. Wireshark筛选常用命令
  9. go语言学习(2)rune以及strings
  10. Koadic的安装和使用---http c2远控工具