• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

DelphiTWebBrowser

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Delphi WebBrowser控件的使用

WebBrowser控件属性:
1、Application
      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,程序将返回WebBrowser控件的自动化对象
2、Parent
       返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口
3、Containe
       返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同
4、Document
       为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则Document属性提供对DHTML Object Model的访问途径
5、TopLevelContainer
       返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true
6、Type
       返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返回Microsoft Word Document
7、Left
       返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离
8、Top
       返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离
9、Width
       返回或设置WebBrowser窗口的宽度,以像素为单位
10、Height
       返回或设置WebBrowser窗口的高度,以像素为单位
11、LocationName
       返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源是网页就是网页的标题;如果是文件或文件夹 ,就是文件或文件夹的名称
12、LocationURL
       返回WebBrowser当前正在显示的资源的URL
13、Busy
       返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true就可以使用stop方法来撤销正在执行的访问操作<br/>

 


WebBrowser控件的事件:

<br/>

1、BeforeNavigate2 导航发生前激发,刷新时不激发

2、CommandStateChange 当命令的激活状态改变时激发。它表明何时激活或关闭Back和Forward菜单项或按钮

3、DocumentComplete 当整个文档完成是激发,刷新页面不激发

4、DownloadBegin 当某项下载操作已经开始后激发,刷新也可激发此事件

5、DownloadComplete 当某项下载操作已经完成后激发,刷新也可激发此事件

6、 NavigateComplete2 导航完成后激发,刷新时不激发 NewWindow2 在创建新窗口以前激发

7、OnFullScreen 当FullScreen属性改变时激发。该事件采用VARIENT_BOOL的一个输入参数来指示IE是全屏显示方式(VARIENT_TRUE)还是普通显 示方式(VARIENT_FALSE)

8、OnMenuBar 改变MenuBar的属性时激发,标示参数是VARIENT_BOOL类型的。VARIANT_TRUE是可见,VARIANT_ FALSE是隐藏

9、OnQuit 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发

10、 OnStatusBar 与OnMenuBar调用方法相同,标示状态栏是否可见。

11、 OnToolBar 调用方法同上,标示工具栏是否可见。

12、 OnVisible 控制窗口的可见或隐藏,也使用一个VARIENT_BOOL类型的参数

13、StatusTextChange 如果要改变状态栏中的文字,这个事件就会被激发,但它并不理会程序是否有状态栏

14、TitleChange 网页标题有效或改变时激发

例子程序
1、WebBrowser1.OleObject.document.all.item('btnName').click;//根据页面中按钮的名称执行其点击事件
 
2、WebBrowser1.OleObject.document.getElementByID('btnID').click;//根据按钮ID点击
 
3、WebBrowser1.OleObject.document.getElementsByTagName('input').item(0).click;//根据按钮索引点击
 
4、WebBrowser1.OleObject.document.all.item('userName').value:=userName;//修改文本框信息,也可用ID,同上
 
5、ShellExecute(0,'open','www.baidu.com',nil,nil,SW_SHOW);//为浏览器打开一个网页

WebBrowser控件的函数:

1、GoBack 相当于IE的”后退”按钮,使你在当前历史列表中后退一项

2、GoForward 相当于IE的”前进”按钮,使你在当前历史列表中前进一项

3、 GoHome 相当于IE的”主页”按钮,连接用户默认的主页

4、GoSearch 相当于IE的”搜索”按钮,连接用户默认的搜索页面

5、 Navigate 连接到指定的URL

6、Refresh 刷新当前页面

7、Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表,该表定义在ExDisp.h中,可以指定的不同值 如下: REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 REFRESH_CONTINUE 仅作内部使用 REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器 <br><br/>

 

初始化和终止化 这几句话放在主窗口所有语句之后,“end.”之前(需引用ActiveX单元)。

Initialization
  OleInitialize(nil);
Finalization
try
  OleUninitialize;
except
end;

 

 
 
 
TWebBrowser浏览相关

Webbrower的显示和隐藏
  WebBrowser1.Visible:=False;//这句是没有效果的
  TWinControl(WebBrowser1).Visible:=False;

 

OnCommandStateChange事件
    
当执行TWebBrowser组件的某个方法的功能改变时被触发,其状态取值决定于执行Web浏览器中某个方法的功能。

property OnCommandStateChange: TWebBrowserCommandStateChange;

type TWebBrowserCommandStateChange = procedure(Sender: TObject; Command: Integer; Enable: WordBool) of object;

Sender:指出其功能已变化的Web浏览器组件。

Command:指出功能变化的调用方法,参数取值如表所示。

 

常量

说明

CSC_UPDATECOMMANDS

−1

不被其他常量包含的任何变化,应用程序必须检查Web浏览器的该属性以更新控制,

例如,事件处理程序可能在更新Stop按钮时检查Busy属性

CSC_NAVIGATEFORWARD

1

历史列表改变GoForward方法导航到一个新的URL的功能,Enable参数指定GoForward方法现在是否导航到一个新的URL

CSC_NAVIGATEBACK

2

历史列表改变GoBack方法导航到一个新的URL的功能,Enable参数指定GoBack方法现在是否导航到一个新的URL

 

 

Enable:指定CSC_NAVIGATEFORWARDCSC_NAVIGATEBACK命令是否可用,其值为True时,可用;否则不可用。

示例:

OnCommandStateChange事件提供了一个命令状态改变后的处理功能,通过该事件能够判断执行某个命令后的当前浏览器状态,例如控制“后退”、“前进”或“停止”按钮是否可用,代码如下:


procedure TForm1.WebBrowser1CommandStateChange(ASender: TObject;Command: Integer; Enable: WordBool);
Var  bRtn:Boolean;
begin
  case Command of
    CSC_NAVIGATEBACK: ToolButton_Back.Enabled := Enable;    //“后退”按钮
    CSC_NAVIGATEFORWARD: ToolButton_Forward.Enabled := Enable;    //“前进”按钮
    CSC_UPDATECOMMANDS: ToolButton_Stop.Enabled := TWebBrowser(ASender).Busy;  //“停止”按钮
  end;
end;

 

使用进度条查看浏览器状态

procedure TForm1.WebBrowser1ProgressChange(ASender: TObject; Progress,
  ProgressMax: Integer);
begin
  ProgressBar1.Max:=ProgressMax;
  if Progress = -1 then
     //ProgressBar1.Visible:=false
  else
  begin
    ProgressBar1.Position := Progress;
    ProgressBar1.Visible := True;
  end;
  if  ProgressBar1.Position = ProgressMax then
    //ProgressBar1.Visible:=False;
end;

 

1、去掉TWebBrowser的滚动条

方法1
    uses  MSHTML_TLB,MSHTML;
    IHTMLBodyElementDisp(IHTMLDocument2(WebBrowser1.document).body).scroll:= 'no';
 
方法2
    WebBrowser1.oleobject.Document.body.style.overflow:='hidden';

    

2、滚屏

uses MSHTML;
var
    a: IHTMLDocument2;
    x,y:Integer;
begin
    y:
=y+20;   //加减进行上下滚动
    a :
=WebBrowser1.Document as IHTMLDocument2;
    a.Get_ParentWindow.Scroll(x,y);
end;

    

3、去边框  边框去掉后 Webbrowser编辑时使用Enter换行无效 但可以使用Shift+Enter换行 Xe2有这个问题XE4正常

margin

应该有上下左右的

WebBrowser1.OleObject.Document.Body.style.border := 'none';
WebBrowser1.OleObject.Document.Body.Style.margin :
= '0px';

    

 

 

4、禁止提示脚步错误

procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject;const pDisp: IDispatch; var URL: OleVariant);
begin
    WebBrowser1.Silent := True;
end;

    

5、禁止弹出窗口

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;  var Cancel: WordBool);
begin
  Cancel := True;
end;
    

6、屏蔽右键菜单  先要添加ApplicationEvents1,指定其Message事件

//ApplicationEvents1.Event.OnMessage
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  with Msg do
  begin
    if not IsChild(WebBrowser1.Handle, hWnd) then
      Exit;
      Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
  end;
end;
    

屏蔽右键菜单

//Here's the code to disable the context menu (the one a user gets when it right-clicks inside a TWebBrowser) for TWebBrowser in a Delphi application:


function MouseProc(nCode: Integer; wParam, lParam: Longint): LongInt; stdcall;
var
   classbuf: array[0..255] of Char;
const
   ie = 'Internet Explorer_Server';
begin
   case nCode < 0 of
     True:
       Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
     False:
       case wParam of
       WM_RBUTTONDOWN, WM_RBUTTONUP:
       begin
         GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND, classbuf, SizeOf(classbuf)) ;
         if lstrcmp(@classbuf[0], @ie[1]) = 0 then
           Result := HC_SKIP
         else
           Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
       end
       else
       begin
         Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
       end;
     end; //case wParam
   end; //case nCode
end; (*MouseProc*)


//Form OnCreate
procedure TWebBrowserForm.FormCreate(Sender: TObject) ;
begin
   MouseHook := SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId()) ;
end;

//Form OnDestroy
procedure TWebBrowserForm.FormDestroy(Sender: TObject) ;
begin
   if MouseHook <> 0 then UnHookWindowsHookEx(MouseHook) ;
end;


If you want to find more about Windows hooks, read the :An introduction to hook procedures

7、替换右键菜单

aaaa
    
 

7、通过IUniformResourceLocator接口建立Internet快捷方式

aaaa
 

8、设置焦点 (当Webbrowser处于编辑模式)
TWebBrowser非常特殊,它从TWinControl继承来的SetFocus方法并不能使得它所包含的文档获得焦点

//方法1
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
   if Form1.WebBrowser1.Document <> nil then
     with WebBrowser1.Application as IOleobject do
        DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect());
end;
 
//方法2 Form1OnCreate事件无效
if WebBrowser1.Document <> nil then
    IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).Focus();

 

 

    

9、缩放网页 
    Ctrl+中键↑ 放大  
    Ctrl+中键↓ 缩小

const
  OLECMDID_OPTICAL_ZOOM = 63;
var
  ZoomIn: OleVariant;
begin
  ZoomIn := 10;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, ZoomIn);
end;

 

 

  

10、读取当前页面字体大小
 类似“字体”菜单上的从“最大”到“最小”五项(对应整数0~4,Largest等假设为五个菜单项的名字,Tag 属性分别设为0~4)。

//读取当前页面字体大小
var

t: OleVariant;
Begin
  WebBrowser1.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,EmptyParam,t);
  case t of
    4: Caption :='最大';
    3: Caption :='较大';
    2: Caption :='中';
    1: Caption :='较小';
    0: Caption :='最小';
  end;
end;

//设置页面字体大小 这句代码Delphi7不能编译通过 Delphi Xe2可以运行
   WebBrowser1.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,3);

 

 

  

11、添加到收藏夹 参考MFC的


const
    CLSID_ShellUIHelper: TGUID = '{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
procedure AddFavorite(Webbrowser:TWebBrowser);
var
ShellUIHelper: ISHellUIHelper;
url, title: Olevariant;
begin
  Title := Webbrowser.LocationName;
  Url :=  Webbrowser.LocationUrl;
  if Url <>'' then
   begin
      ShellUIHelper := CreateComObject(CLSID_SHELLUIHELPER) as IShellUIHelper;
      ShellUIHelper.AddFavorite(url, title);
   end;
end;
  

整理收藏夹

var  p:procedure(Handle: THandle; Path: PChar); stdcall;
procedure OrganizeFavorite();
var
H: HWnd;
begin
  H := LoadLibrary(PChar('shdocvw.dll'));
  if H <> 0 then
   begin
    p := GetProcAddress(H, PChar('DoOrganizeFavDlg'));
   if Assigned(p) then p(Application.Handle, PChar(''));
   end;
   FreeLibrary(h);
end;

 

 

11、 Internet 选项

uses ActiveX;
const
  CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
//  HTMLID_FIND = 1;      //查找对话框
//  HTMLID_VIEWSOURCE= 2; //查看源代码
//  HTMLID_OPTIONS =3;    //Internet选项
procedure WB_ShellIEOptions(WebBrowser: TWebbrowser);

var
  CmdTarget : IOleCommandTarget;
  vaIn, vaOut: OleVariant;
  PtrGUID: PGUID;
begin
  New(PtrGUID) ;
  PtrGUID^ := CGID_WebBrowser;
  if WebBrowser.Document <> nil then
    try
      WebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget) ;
      if CmdTarget <> nil then
        try
          CmdTarget.Exec(PtrGUID, 3, 0, vaIn, vaOut) ;
        finally
          CmdTarget._Release;
        end;
    except
    end;
  Dispose(PtrGUID) ;
end;

 

 

11、获取网页源码相关

1

2

3

Memo1.Text := WebBrowser1.OleObject.document.body.outerHTML; //body内的所有代码, 包含body标签
Memo1.Text := WebBrowser1.OleObject.document.documentElement.innerHTML; //html内的所有代码
Memo1.Text := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码
   

 

11、 获取网页源文件的代码 网页右键 查看源文件    f1dfb8ff-ddb6-4ff5-8c99-4044bff87a12_0.htm - 记事本

procedure GetHtmlSourceCode(const RichEdit:TRichEdit);
var
ms: TMemoryStream;
begin
   if not Assigned(Form1.WebBrowser1.Document) then Exit;
    ms := TMemoryStream.Create;
    (Form1.WebBrowser1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True);
    ms.Position := 0;
    RichEdit.Lines.LoadFromStream(ms, TEncoding.UTF8);
    // Memo1.Lines.LoadFromStream(ms, TEncoding.Default); {GB2312 等双字节}
    ms.Free;
end;

 

11、 获取网页源文件的代码 出来的结果乱码 unicode?

 
function   GetHtml(const   WebBrowser:TWebBrowser):   string;
const
    BufSize   =   $10000;
var
    Size:   Int64;
    Stream:   IStream;
    hHTMLText:   HGLOBAL;
    psi:   IPersistStreamInit;
begin
    if   not   Assigned(WebBrowser.Document)   then   Exit;

    OleCheck(WebBrowser.Document.QueryInterface
    (IPersistStreamInit,   psi));
    try
    OleCheck(psi.GetSizeMax(Size));
        hHTMLText   :=   GlobalAlloc(GPTR,   BufSize);
        if   0   =   hHTMLText   then   RaiseLastWin32Error;

        OleCheck(CreateStreamOnHGlobal(hHTMLText,True,   Stream));

        try
            OleCheck(psi.Save(Stream,   False));

            Size   :=   StrLen(PChar(hHTMLText));
            SetLength(Result,   Size);
            CopyMemory(PChar(Result),   Pointer(hHTMLText),   Size);
        finally
            Stream   :=   nil;
        end;
    finally
        psi   :=   nil;
    end;
end;

 

11、 用记事本查看源代码

uses ActiveX;
const
  CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
 
  //HTMLID_FIND = 1;      //查找对话框
  //HTMLID_VIEWSOURCE= 2; //查看源代码
  //HTMLID_OPTIONS =3;    //Internet选项

procedure WB_ViewSource(WebBrowser: TWebbrowser);
var
  CmdTarget : IOleCommandTarget;
  vaIn, vaOut: OleVariant;
  PtrGUID: PGUID;
begin
  New(PtrGUID) ;
  PtrGUID^ := CGID_WebBrowser;
  if WebBrowser.Document <> nil then
    try
      WebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget) ;
      if CmdTarget <> nil then
        try
          CmdTarget.Exec(PtrGUID, 2, 0, vaIn, vaOut) ;
        finally
          CmdTarget._Release;
        end;
    except
    end;
  Dispose(PtrGUID) ;
end;

 

 

__、设置编码

    procedure Set_charset(const p: WideString); safecall;
    function  Get_charset: WideString; safecall;
p的编码列表有哪些
//设置编码
procedure SetCharSet(AWebBrowser: TWebBrowser; ACharSet: String);
var
RefreshLevel: OleVariant;
Begin
  IHTMLDocument2(AWebBrowser.Document).Set_CharSet(ACharSet);
  RefreshLevel :=7; //这个7应该从注册表来,帮助有Bug。
  AWebBrowser.Refresh2(RefreshLevel);
End;


//获取当前页面编码
Caption:=IHTMLDocument2(Webbrowser1.Document).Get_charset;
 
 
 

Cookies

 

var
    doc: IHTMLDocument2;//定义变量
begin
    Doc:=WebBrowser1.Document as IHTMLDocument2;
    Doc.cookie:=redt_ViewSource.text;//把edit2中修改好的cookie重新赋值给doc
    WebBrowser1.Refresh;//刷新页面,修改cookie
end;

 

11、执行网页源代码成网页

procedure ExecHTML(WebBrowser:TWebBrowser;HtmlCode:string);
var
StringStream:TStringStream;
begin
StringStream := TStringStream.Create(HtmlCode);
//WebBrowser.Navigate('about:blank');
try
   StringStream.Position := 0;
   (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(StringStream));
finally
   StringStream.Free;
end;
end;

我现在发现如果webbrowser内容比较少 就正常 如果内容多 右边有滚动条 这时候进来 点击滚动条
就会报“Floating point division by zero ” 这个错误 而且报完 界面被强制关闭掉 不知道阁下有没遇到这个问题 这里我代码中没有任何除法操作 只要webbrowser内容多 有滚动条 点击滚动条 就会这样
使用Delphi XE4 就没有这个问题

 

 
 

11、  加载HTML 将HTML代码转换成网页 


procedure WBLoadHTML(WebBrowser: TWebBrowser; HTMLCode: string) ;
var
   sl: TStringList;
   ms: TMemoryStream;
begin
   WebBrowser.Navigate('about:blank') ;
   while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
    Application.ProcessMessages;

   if Assigned(WebBrowser.Document) then
   begin
     sl := TStringList.Create;
     try
       ms := TMemoryStream.Create;
       try
         HTMLCode:='<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>'+HTMLCode;
         sl.Text := HTMLCode;
         sl.SaveToStream(ms) ;
         ms.Seek(0, 0) ;
         (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)) ;
       finally
         ms.Free;
       end;
     finally
       sl.Free;
     end;
   end;
end;


 

 
 

 

11、 加载HTML成WEB

  webbrowser.OleObject.Document.Writeln('HTML CODE');
  webbrowser.Refresh;


 

 
 

 

11、QueryStatusWB

function QueryStatusWB(cmdID: OLECMDID): OLECMDF;
 

cmdID列表

描述

OLECMDF_SUPPORTED

1

Web浏览器支持这个命令(但是该命令可能未被使用)

OLECMDF_ENABLED

2

该命令当前是使用的

OLECMDF_LATCHED

4

该命令是一个打开/关闭开关,当前处于打开的状态

OLECMDF_NINCHED

8

当前尚未使用该值

OLECMDF_INVISIBLE

16

当前尚未使用该值


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
怎样用delphi关闭并重新启动explorer.exe进程发布时间:2022-07-18
下一篇:
Delphi编程--字符处理发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap