⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 浏览器.txt

📁 大量Delphi开发资料
💻 TXT
📖 第 1 页 / 共 2 页
字号:
     end;
    end;

--------------------------------------------------------------------------
------------------------------

6、使WebBrowser获得焦点

  TWebBrowser非常特殊,它从TWinControl继承来的SetFocus方法并不能使得它所
包含的文档获得焦点,从而不能立即使用Internet Explorer本身具有得快捷键,解
决方法如下:<

  procedure TForm1.SetFocusToDoc;
  begin
   if WebBrowser1.Document <> nil then
    with WebBrowser1.Application as IOleobject do
     DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle,
GetClientRect);
  end;

  除此之外,我还找到一种更简单的方法,这里一并列出:

  if WebBrowser1.Document <> nil then
   
IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).focus

  刚找到了更简单的方法,也许是最简单的:

  if WebBrowser1.Document <> nil then
   IHTMLWindow4(WebBrowser1.Document).focus

  还有,需要判断文档是否获得焦点这样来做:

  if IHTMLWindow4(WebBrowser1.Document).hasfocus then

--------------------------------------------------------------------------
------------------------------

7、点击“提交”按钮

  如同程序里每个窗体上有一个“缺省”按钮一样,Web页面上的每个Form也有一
个“缺省”按钮——即属性为“Submit”的按钮,当用户按下回车键时就相当于鼠标
单击了“Submit”。但是TWebBrowser似乎并不响应回车键,并且,即使把包含
TWebBrowser的窗体的KeyPreview设为True,在窗体的KeyPress事件里还是不能截获
用户向TWebBrowser发出的按键。
  我的解决办法是用ApplicatinEvents构件或者自己编写TApplication对象的
OnMessage事件,在其中判断消息类型,对键盘消息做出响应。至于点击“提交”按
钮,可以通过分析网页源代码的方法来实现,不过我找到了更为简单快捷的方法,有
两种,第一种是我自己想出来的,另一种是别人写的代码,这里都提供给大家,以做
参考。

  A、用SendKeys函数向WebBrowser发送回车键
    在Delphi 5光盘上的Info\Extras\SendKeys目录下有一个SndKey32.pas文
件,其中包含了两个函数SendKeys和AppActivate,我们可以用SendKeys函数来向
WebBrowser发送回车键,我现在用的就是这个方法,使用很简单,在WebBrowser获得
焦点的情况下(不要求WebBrowser所包含的文档获得焦点),用一条语句即可:

   Sendkeys('~',true);// press RETURN key

   SendKeys函数的详细参数说明等,均包含在SndKey32.pas文件中。

  B、在OnMessage事件中将接受到的键盘消息传递给WebBrowser。

   procedure TForm1.ApplicationEvents1Message(var Msg: TMsg; var
Handled: Boolean);
   {fixes the malfunction of some keys within webbrowser control}
   const
    StdKeys = [VK_TAB, VK_RETURN]; { standard keys }
    ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended
keys }
    fExtended = $01000000; { extended key flag }
   begin
    Handled := False;
    with Msg do
    if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
     ((wParam in StdKeys) or
     {$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
     (wParam in ExtKeys) and
     ((lParam and fExtended) = fExtended)) then
    try
     if IsChild(Handle, hWnd) then { handles all browser related
messages }
     begin
      with {$IFDEF VER120}Application_{$ELSE}Application{$ENDIF} as
        IOleInPlaceActiveObject do
       Handled := TranslateAccelerator(Msg) = S_OK;
       if not Handled then
       begin
        Handled := True;
        TranslateMessage(Msg);
        DispatchMessage(Msg);
       end;
       end;
    except
    end;
   end; // MessageHandler

  (此方法来自EmbeddedWB.pas)

--------------------------------------------------------------------------
------------------------------

8、直接从TWebBrowser得到网页源码及Html

  下面先介绍一种极其简单的得到TWebBrowser正在访问的网页源码的方法。一般
方法是利用TWebBrowser控件中的Document对象提供的IPersistStreamInit接口来实
现,具体就是:先检查WebBrowser.Document对象是否有效,无效则退出;然后取得
IPersistStreamInit接口,接着取得HTML源码的大小,分配全局堆内存块,建立流,
再将HTML文本写到流中。程序虽然不算复杂,但是有更简单的方法,所以实现代码不
再给出。其实基本上所有IE的功能TWebBrowser都应该有较为简单的方法来实现,获
取网页源码也是一样。下面的代码将网页源码显示在Memo1中。

   
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);

  同时,在用TWebBrowser浏览HTML文件的时候要将其保存为文本文件就很简单
了,不需要任何的语法解析工具,因为TWebBrowser也完成了,如下:

   
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);

--------------------------------------------------------------------------
------------------------------

9、“查找”功能

  查找对话框可以在文档获得焦点的时候通过按键Ctrl-F来调出,程序中则调用
IOleCommandTarget对象的成员函数Exec执行OLECMDID_FIND操作来调用,下面给出的
方法是如何在程序中用代码来做出文字选择,即你可以自己设计查找对话框。

   var
    Doc: IHtmlDocument2;
    TxtRange: IHtmlTxtRange;
   begin
    Doc :=WebBrowser1.Document as IHtmlDocument2;
    Doc.SelectAll;    //此处为简写,选择全部文档的方法请参见第三条
命令操作
                //这句话尤为重要,因为IHtmlTxtRange对象的
方法能够操作的前提是
                //Document已经有一个文字选择区域。由于接着
执行下面的语句,所以不会
                //看到文档全选的过程。
    TxtRange :=Doc.Selection.CreateRange as IHtmlTxtRange;
    TxtRange.FindText('Text to be searched',0.0);
    TxtRange.Select;
   end;

  还有,从Txt.Get_text可以得到当前选中的文字内容,某些时候是有用的。

--------------------------------------------------------------------------
------------------------------

10、提取网页中所有链接

  这个方法来自大富翁论坛hopfield朋友的对一个问题的回答,我本想自己试验,
但总是没成功。

  var
   doc:IHTMLDocument2;
   all:IHTMLElementCollection;
   len,i:integer;
   item:OleVariant;
  begin
   doc:=WebBrowser1 .Document as IHTMLDocument2;
   all:=doc.Get_links;             //doc.Links亦可
   len:=all.length;
   for i:=0 to len-1 do begin
    item:=all.item(i,varempty);        //EmpryParam亦可
    memo1.lines.add(item.href);
   end;
  end;

--------------------------------------------------------------------------
------------------------------

11、设置TWebBrowser的编码

  为什么我总是错过很多机会?其实早就该想到的,但是一念之差,便即天壤之
别。当时我要是肯再多考虑一下,多试验一下,这就不会排到第11条了。下面给出
一个函数,搞定,难以想象的简单。

  procedure SetCharSet(AWebBrowser: TWebBrowser; ACharSet: String);
  var
   RefreshLevel: OleVariant;
  Begin
   IHTMLDocument2(AWebBrowser.Document).Set_CharSet(ACharSet);
   RefreshLevel :=7;              //这个7应该从注册表来,
帮助有Bug。
   AWebBrowser.Refresh2(RefreshLevel);


--------------------------------------------------------------------------
---
该问题的URL是: http://www.delphibbs.com/delphibbs/dispq.asp?LID=2211196

欢迎经常光顾,争取上大富翁排行榜。

大富翁论坛(http://www.delphibbs.com/delphibbs)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -