手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

老文章——TWebBrowser编程简述

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  下面的过程就告诉你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。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!