文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
WebBrower控件接口表
把整个网页保存成JPG图片(针对单框架..


技术教程 -> delphi教程 ->  
WebBrower控件接口表
来源:转载   人气:537   录入时间:2007-11-8
        5、添加到收藏夹和整理收藏夹
           const
           CLSID_ShellUIHelper: TGUID =
      '{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
          var
           p:procedure(Handle: THandle; Path: PChar); stdcall;
          procedure TForm1.OrganizeFavorite(Sender: Tobject);
          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(FavFolder));
           end;
           FreeLibrary(h);
          end;
          
          procedure TForm1.AddFavorite(Sender: TObject);
          var
           ShellUIHelper: ISHellUIHelper;
           url, title: Olevariant;
          begin
           Title := Webbrowser1.LocationName;
           Url := Webbrowser1.LocationUrl;
           if Url <> '' then
           begin
            ShellUIHelper := CreateComObject(CLSID_SHELLUIHELPER) as
      IShellUIHelper;
            ShellUIHelper.AddFavorite(url, title);
           end;
          end;
        用上面的通过ISHellUIHelper接口来打开“添加到收藏夹”对话框的方法比较简单,但是有个缺陷,就是打开的窗口不是模式窗口,而是独立于应用程序的。可以想象,如果使用与OrganizeFavorite过程同样的方法来打开对话框,由于可以指定父窗口的句柄,自然可以实现模式窗口(效果与在资源管理器和IE中打开“添加到收藏夹”对话框相同)。问题显然是这样的,上面两个过程的作者当时只知道shdocvw.dll中DoOrganizeFavDlg的原型而不知道DoAddToFavDlg的原型,所以只好用ISHellUIHelper接口来实现(或许是他不够严谨,认为是否是模式窗口无所谓?)。
        下面的过程就告诉你DoAddToFavDlg的函数原型。需要注意的是,这样打开的对话框并不执行“添加到收藏夹”的操作,它只是告诉应用程序用户是否选择了“确定”,同时在DoAddToFavDlg的第二个参数中返回用户希望放置Internet快捷方式的路径,建立.Url文件的工作由应用程序自己来完成。
          procedure TForm1.AddFavorite(IE: TEmbeddedWB);
           procedure CreateUrl(AUrlPath, AUrl: PChar);
           var
            URLfile: TIniFile;
           begin
            URLfile := TIniFile.Create(String(AUrlPath));
           RLfile.WriteString('InternetShortcut', 'URL',
      String(AUrl));
           RLfile.Free;
           end;
          var
           AddFav: function(Handle: THandle;
            UrlPath: PChar; UrlPathSize: Cardinal;
            Title: PChar; TitleSize: Cardinal;
            FavIDLIST: pItemIDList): Bool; stdcall;
           FDoc: IHTMLDocument2;
           UrlPath, url, title: array[0..MAX_PATH] of char;
           H: HWnd;
           pidl: pItemIDList;
           FRetOK: Bool;
          begin
           FDoc := IHTMLDocument2(IE.Document);
           if FDoc = nil then exit;
           StrPCopy(Title, FDoc.Get_title);
           StrPCopy(url, FDoc.Get_url);
           if Url <> '' then
           begin
            H := LoadLibrary(PChar('shdocvw.dll'));
            if H <> 0 then
            begin
             SHGetSpecialFolderLocation(0, CSIDL_FAVORITES, pidl);
             AddFav := GetProcAddress(H, PChar('DoAddToFavDlg'));
             if Assigned(AddFav) then
              FRetOK :=AddFav(Handle, UrlPath, Sizeof(UrlPath),
      Title, Sizeof(Title), pidl)
            end;
            FreeLibrary(h);
            if FRetOK then
             CreateUrl(UrlPath, Url);
           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);
        End;
   
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987