delphi中webbrowser的用法

时间:2022-01-21 04:07:30
  1. WebBrowser1.GoHome; //到浏览器默认主页
  2. WebBrowser1.Refresh; //刷新
  3. WebBrowser1.GoBack; //后退
  4. WebBrowser1.GoForward; //前进
  5. WebBrowser1.Navigate('...'); //打开指定页面
  6. WebBrowser1.Navigate('about:blank'); //打开空页面
  7. //打开空页面, 并写入...
  8. WebBrowser1.Navigate('about:<head><title>标题</title><body>页面内容</body>');
  9. //读取网页脚本中的变量:
  10. procedure TForm1.Button1Click(Sender: TObject);
  11. var
  12. s: string;
  13. i: Integer;
  14. begin
  15. s := WebBrowser1.OleObject.document.Script.str;
  16. i := WebBrowser1.OleObject.document.Script.num;
  17. ShowMessage(s); //Hello
  18. ShowMessage(IntToStr(i)); //99
  19. //也可以这样读:
  20. s := WebBrowser1.OleObject.document.parentWindow.str;
  21. i := WebBrowser1.OleObject.document.parentWindow.num;
  22. ShowMessage(s); //Hello
  23. ShowMessage(IntToStr(i)); //99
  24. end;
  25. //调用网页脚本中的函数:
  26. procedure TForm1.Button1Click(Sender: TObject);
  27. begin
  28. WebBrowser1.OleObject.document.parentWindow.MB(); //HTML-Js
  29. //如需指定脚本语言, 需要:
  30. WebBrowser1.OleObject.document.parentWindow.execScript('MB()','JavaScript'); //HTML-Js
  31. end;
  32. //判断网页及内部框架网页是否全部下载完毕
  33. procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  34. const pDisp: IDispatch; var URL: OleVariant);
  35. begin
  36. if   not(<span style="font-family: Arial, Helvetica, sans-serif;">WebBrowser1</span>.Busy)   then
  37. ShowMessage('下载完毕');
  38. end;
  39. //改变背景色或背景图片:
  40. WebBrowser1.OleObject.document.body.bgcolor := '#FF0000';
  41. WebBrowser1.OleObject.document.body.background := '...图片地址';
  42. //操作有 ID 标签的对象:
  43. var
  44. s: string;
  45. begin
  46. s := WebBrowser1.OleObject.document.getElementByIdx_x('span1').innerText;
  47. ShowMessage(s); //这是 span1 标签中的内容
  48. //或者:
  49. s := WebBrowser1.OleObject.document.parentWindow.span1.innerText;
  50. ShowMessage(s); //这是 span1 标签中的内容
  51. //隐藏它:
  52. WebBrowser1.OleObject.document.parentWindow.span1.style.display := 'none';
  53. end;
  54. //获取网页源代码
  55. var
  56. s: string;
  57. begin
  58. s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码
  59. s := WebBrowser1.OleObject.document.body.outerHTML; //body内的所有代码, 包含body标签
  60. s := WebBrowser1.OleObject.document.documentElement.innerHTML; //html内的所有代码
  61. end;
  62. </pre><pre name="code" class="delphi"><span style="color: rgb(73, 73, 73); font-family: simsun; font-size: 14px; line-height: 21px;">Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);</span>
  63. //获取网页全部源代码
  64. uses ActiveX;
  65. var
  66. ms: TMemoryStream;
  67. begin
  68. if not Assigned(WebBrowser1.Document) then Exit;
  69. ms := TMemoryStream.Create;
  70. (WebBrowser1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True);
  71. ms.Position := 0;
  72. Memo1.Lines.LoadFromStream(ms, TEncoding.UTF8);
  73. // Memo1.Lines.LoadFromStream(ms, TEncoding.Default); {GB2312 等双字节}
  74. ms.Free;
  75. end;
  76. //WebBrowser 中的右键菜单
  77. //先要添加ApplicationEvents1,指定其Message事件
  78. //屏蔽右键菜单
  79. procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  80. begin
  81. with Msg do
  82. begin
  83. if not IsChild(WebBrowser1.Handle, hWnd) then Exit;
  84. Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
  85. end;
  86. end;
  87. //替换右键菜单
  88. procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  89. var mPoint: TPoint;
  90. begin
  91. if IsChild(WebBrowser1.Handle, Msg.Hwnd) and
  92. ((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP)) then
  93. begin
  94. GetCursorPos(mPoint); //得到光标位置
  95. PopupMenu1.Popup(mPoint.X, mPoint.Y); //弹出popupmenu1的菜单
  96. Handled:=True;
  97. end;
  98. end;
  99. //新页面写入
  100. begin
  101. WebBrowser1.Navigate('about:blank');
  102. WebBrowser1.OleObject.Document.Writeln('ok');
  103. end;
  104. //从流中写入:
  105. var
  106. ms: TMemoryStream;
  107. begin
  108. ms := TMemoryStream.Create;
  109. Memo1.Lines.SaveToStream(ms);
  110. ms.Position := 0;
  111. (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
  112. ms.Free;
  113. end;
  114. //禁止提示脚步错误
  115. procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject;
  116. const pDisp: IDispatch; var URL: OleVariant);
  117. begin
  118. WebBrowser1.Silent := True;
  119. end;
  120. </pre><pre name="code" class="delphi">方法二
  121. TWebBrowser的OnDownloadComplete事件里面执行
  122. (WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript('window.onerror=function(){return true}','JavaScript');
  123. </pre><pre name="code" class="delphi">//禁止弹出窗口
  124. procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
  125. var Cancel: WordBool);
  126. begin
  127. Cancel := True;
  128. end;
  129. </pre><pre name="code" class="delphi">//使WebBrowser获得焦点
  130.   TWebBrowser非常特殊,它从TWinControl继承来的SetFocus方法并不能使得它所twebbrows setfocu 方法包含的文档获得焦点,从而不能立即使用Internet Explorer本身具有得internet explor 使用快捷键,解决方法如下:<
  131.   procedure TForm1.SetFocusToDoc;
  132.   begin
  133.    if WebBrowser1.Document <> nil then
  134.     with WebBrowser1.Application as Ioleobject do
  135.      DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect);
  136.   end;
  137.   除此之外,我还找到一种更简单的方法,这里一并列除此之外这里并列出:
  138.   if WebBrowser1.Document <> nil then
  139.    IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).focus
  140.   刚找到了更简单的方法,也许是最简单的:
  141.   if WebBrowser1.Document <> nil then
  142.    IHTMLWindow4(WebBrowser1.Document).focus
  143.   还有,需要判断文档是否获得焦点这样来做:
  144.   if IHTMLWindow4(WebBrowser1.Document).hasfocus then
  145. </pre><pre name="code" class="delphi">
  146. //查找内容
  147.   查找对话框可以在文档获得焦点的时候通过按键Ctrl-F对话框焦点按键来调出,程序中则调用IOleCommandTarget对象的成员函数Exec执行OLECMDID_FIND操作olecmdid 操作执行来调用,下面给出的方法是如何在程序中用代码来做出文下面方法如何字选择,即你可以自己设计查找对话框。
  148.    Var
  149.     Doc: IHtmlDocument2;
  150.     TxtRange: IHtmlTxtRange;
  151.    begin
  152.     Doc :=WebBrowser1.Document as IHtmlDocument2;
  153.     Doc.SelectAll;    //此处为简写,选择全部文档的方法selectal 方法文档请参见第三条命令操作
  154.                 //这句话尤为重要,因重要尤为为IHtmlTxtRange对象的方法能够操作的前提是
  155.                 //Document已经有一个文字选document 文字一个择区域。由于接着执行下面的语句,所以不会
  156.                 //看到文档全选的过程看到过程文档。
  157.     TxtRange :=Doc.Selection.CreateRange as IHtmlTxtRange;
  158.     TxtRange.FindText('Text to be searched',0.0);
  159.     TxtRange.Select;
  160.    end;
  161.   还有,从Txt.Get_text可以得到当前选中的文字内容,某些得到文字当前时候是有用的。
  162. </pre><pre name="code" class="delphi">//点击“提交”按钮
  163.   如同程序里每个窗体上有一个“缺省”按钮一样,Web一样按钮每个页面上的每个Form也有一个“缺省”按钮——即属性为“Submitsubmit form 按钮”的按钮,当用户按下回车键时就相当于鼠标单击了“Submitsubmit 回车键相当”。但是TWebBrowser似乎并不响应回车键,并且,即使把包含TWebBrowser的twebbrows 回车键似乎窗体的KeyPreview设为True,在窗体的KeyPress事件里还是不能截获用户向keypreview keypress 事件TWebBrowser发出的按键。
  164.   我的解决办法是用ApplicatinEvents构件或者自己编写Tapplication对象的OnMessage事onmessag tapplic 构件件,在其中判断消息类型,对键盘消息做出响应。至于点至于响应判断击“提交”按钮,可以通过分析网页源代码的方法来实现源代码网页方法,不过我找到了更为简单快捷的方法,有两种,第一种是更为不过方法我自己想出来的,另一种是别人写的代码,这里都提供给自己这里出来大家,以做参考。
  165.   A、用SendKeys函数向WebBrowser发送回车键
  166.     在Delphi5光盘上的Info/Extras/SendKeys目录下有一个SndKey32.pas文件,sendkei delphi sndkei其中包含了两个函数SendKeys和AppActivate,我们可以用SendKeys函数来向WebBrowser发appactiv webbrows sendkei送回车键,我现在用的就是这个方法,使用很简单,在WebBrowserwebbrows 回车键使用获得焦点的情况下(不要求WebBrowser所包含的文档获得焦点),webbrows 焦点包含用一条语句即可:
  167.    Sendkeys('~',true);// press RETURN key
  168.    SendKeys函数的详细参数说明等,均包含在SndKey32.pas文件中sendkei sndkei 参数。
  169.   B、在OnMessage事件中将接受到的键盘消息传递给WebBrowser。
  170.    Procedure TForm1.ApplicationEvents1Message(var Msg: TMsg; var Handled: Boolean);
  171.    {fixes the malfunction of some keys within webbrowser control}
  172.    const
  173.     StdKeys = [VK_TAB, VK_RETURN]; { standard keys }
  174.     ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended keys }
  175.     fExtended = $01000000; { extended key flag }
  176.    begin
  177.     Handled := False;
  178.     with Msg do
  179.     if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
  180.      ((wParam in StdKeys) or
  181.      {$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
  182.      (wParam in ExtKeys) and
  183.      ((lParam and fExtended) = fExtended)) then
  184.     try
  185.      if IsChild(Handle, hWnd) then { handles all browser related messages }
  186.      begin
  187.       with {$IFDEF VER120}Application_{$ELSE}Application{$ENDIF} as
  188.         IOleInPlaceActiveObject do
  189.        Handled := TranslateAccelerator(Msg) = S_OK;
  190.        if not Handled then
  191.        begin
  192.         Handled := True;
  193.         TranslateMessage(Msg);
  194.         DispatchMessage(Msg);
  195.        end;
  196.        end;
  197.     except
  198.     end;
  199.    end; // MessageHandler
  200. </pre><pre name="code" class="delphi">
  201. </pre><pre name="code" class="delphi">10、提取网页中所有链接
  202.   这个方法来自大富翁论坛hopfield朋友的对一个问题的回答hopfield 自大问题,我本想自己试验,但总是没成功。
  203.   Var
  204.    doc:IHTMLDocument2;
  205.    all:IHTMLElementCollection;
  206.    len,I:integer;
  207.    item:OleVariant;
  208.   begin
  209.    doc:=WebBrowser1 .Document as IHTMLDocument2;
  210.    all:=doc.Get_links;             //doc.Links亦可
  211.    len:=all.length;
  212.    for I:=0 to len-1 do begin
  213.     item:=all.item(I,varempty);        //EmpryParam亦可
  214.     memo1.lines.add(item.href);
  215.    end;
  216.   end;
  217. -----------------------------------------------------------------------------------
  218. 11、设置TWebBrowser的编码
  219.   为什么我总是错过很多机会?其实早就该想到的,但为什么错过想到是一念之差,便即天壤之别。当时我要是肯再多考虑一下一念之差天壤之别当时,多试验一下,这就不会排到第11条了。下面给出一个下面试验一个函数,搞定,难以想象的简单。
  220.   Procedure SetCharSet(AWebBrowser: TWebBrowser; ACharSet: String);
  221.   var
  222.    RefreshLevel: OleVariant;
  223.   Begin
  224.    IHTMLDocument2(AWebBrowser.Document).Set_CharSet(ACharSet);
  225.    RefreshLevel :=7;              //这个7应该从这个应该注册表来,帮助有Bug。
  226.    AWebBrowser.Refresh2(RefreshLevel);
  227.   End;
  228. </pre><pre name="code" class="delphi">9.将页面中显示的内容全部选中,然后粘贴到Word文档中.
  229. WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);//全选网页
  230. WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT);     //复制网页
  231. WordDocu.Range.Paste;            //word文档粘贴
  232. WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT);    //取消全选
  233. 注:WebBrowser的Document属性值和WordDocument的Document属性值必须都不为nil.
  234. 10.如何解决网页不响应回车事件
  235. public
  236. { Public declarations }
  237. procedure MsgHandle(var Msg :TMsg; var Handled :Boolean);
  238. end;
  239. var
  240. Form1: TForm1;
  241. FOleInPlaceActiveObject :IOleInPlaceActiveObject;
  242. implementation
  243. {$R *.DFM}
  244. procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean);
  245. var
  246. iOIPAO :IOleInPlaceActiveObject;
  247. Dispatch :IDispatch;
  248. begin
  249. if WebBrowser1 =nil then
  250. begin
  251. Handled :=False;
  252. Exit;
  253. end;
  254. Handled :=(IsDialogMessage(WebBrowser1.Handle, Msg) =True);
  255. if (Handled) and (not WebBrowser1.Busy) then
  256. begin
  257. if FOleInPlaceActiveObject =nil then
  258. begin
  259. Dispatch :=WebBrowser1.Application;
  260. if Dispatch <>nil then
  261. begin
  262. Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
  263. if iOIPAO <>nil then
  264. FOleInPlaceActiveObject :=iOIPAO;
  265. end;
  266. end;
  267. end;
  268. if FOleInPlaceActiveObject <>nil then
  269. 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
  270. else
  271. FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  272. end;
  273. procedure TForm1.FormCreate(Sender: TObject);
  274. begin
  275. Application.OnMessage :=MsgHandle;
  276. end;
  277. procedure TForm1.FormDestroy(Sender: TObject);
  278. begin
  279. FOleInPlaceActiveObject :=nil;
  280. end;
  281. </pre><pre name="code" class="delphi">//在WebBrowser加载html页面完成后,在页面顶端插入HTML代码
  282. procedure TForm1.Button1Click(Sender: TObject);
  283. var
  284. Range: IHTMLTxtRange;
  285. begin
  286. Range := ((WebBrowser1.Document as IHTMLDocument2).body as
  287. IHTMLBodyElement).createTextRange;
  288. Range.collapse(False);
  289. Range.pasteHTML('<br/><b>Hello!</b>');
  290. end;
  291. <p>
  292. </p>