比如说,单击了超链接,怎样在我自己的程序中捕获呢?

解决方案 »

  1.   

    使用mousemove mouseup  mousedown等判断,或者使用click属性
      

  2.   

    to  SilveryFox(银狐):click属性怎么用?你能详细说下吗?谢谢
      

  3.   

    捕获他的before navigate事件就可以了
      

  4.   

    unit DnldSkinUnit;
    interface
    uses
    windows, comobj, activex, shdocvw, mshtml,dialogs,PSock,NMHTTP;
    type
      TDnldSkinfactory = class(tcomobjectfactory)
      public
        procedure updateregistry(register: boolean); override;
      end;
      TDnldSkin = class(TComobject, IDispatch, IObjectwithsite)
      public
        function gettypeinfocount(out count: integer): hresult; stdcall;
        function gettypeinfo(index, localeid: integer; out typeinfo): hresult; stdcall;
        function getidsofnames(const iid: tguid; names: pointer;
          namecount, localeid: integer; dispids: pointer): hresult; stdcall;
        function invoke(dispid: integer; const iid: tguid; localeid: integer;
          flags: word; var params; varresult, excepinfo, argerr: pointer): hresult; stdcall;
        function setsite(const punksite: iunknown): hresult; stdcall;
        function getsite(const riid: tiid; out site: iunknown): hresult; stdcall;
      private
        ie: iwebbrowser2;
        cookie: integer;
      end;
    const
      class_DnldSkin: tguid = '{13028081-882B-11D5-AD38-00105A758028}';
      HostName:String='127.0.0.1';
      InstallDir:String='C:\Program Files\myskin\';
    implementation
    uses comserv, registry, sysutils;
    procedure dostatustextchange(const text: widestring);
    begin
    end;
    procedure doprogresschange(progress: integer; progressmax: integer);
    begin
    end;
    procedure docommandstatechange(command: integer; enable: wordbool);
    begin
    end;
    procedure dodownloadbegin;
    begin
    end;
    procedure dodownloadcomplete;
    begin
    end;
    procedure dotitlechange(const text: widestring);
    begin
    end;
    procedure dopropertychange(const szproperty: widestring);
    begin
    end;
    procedure dobeforenavigate2(const pdisp: idispatch; var url: olevariant; var flags: olevariant; var targetframename: olevariant; var postdata: olevariant; var headers: olevariant; var cancel: wordbool);
    var
      DHTTP:TNMHTTP;
      ProxyServer,TempStr:String;
      ProxyEnable:integer;
    begin
      if Pos('/myskin/',url)>0 then
      begin
        showmessage('正在下载Skin,请稍候...');
    //    Screen.Cursor:=crHourGlass;
        with TRegistry.Create do
        begin
          RootKey:=HKEY_CURRENT_USER;
          OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet Settings',False);
          ProxyServer:=ReadString('ProxyServer');
          ProxyEnable:=ReadInteger('ProxyEnable');
          Free;
        end;
        try
          DHTTP:=TNMHTTP.Create(nil);
          DHTTP.Host:=HostName;
          DHTTP.Port:=80;
          DHTTP.InputFileMode:=True;
          if (ProxyServer<>'') and (ProxyEnable=1) then
          begin
            if Pos('http=',ProxyServer)>0 then
              TempStr:=Copy(ProxyServer,Pos('http=',ProxyServer)+5,Length(ProxyServer))
            else
              TempStr:=ProxyServer;
            if Pos(';',TempStr)>0 then TempStr:=Copy(TempStr,1,Pos(';',TempStr)-1);
            DHTTP.Proxy:=Copy(TempStr,1,Pos(':',TempStr)-1);
            DHTTP.ProxyPort:=StrToInt(Copy(TempStr,Pos(':',TempStr)+1,Length(TempStr)));
          end;
          DHTTP.Header:=InstallDir+'Head.txt';
          DHTTP.Body:=InstallDir+'BackGround.bmp';
          DHTTP.Get(Url+'.bmp');
          DHTTP.Free;
        except
          Showmessage('下载Skin失败');
        end;
    //    Screen.Cursor:=crArrow;
        WinExec(PChar('c:\progra~1\Intern~1\Iexplore Http://www.caramella.com.cn'),SW_SHOW);
        cancel:=true;
    //    url:='http://www.applevb.com';
    //    (pdisp as iwebbrowser2).navigate2(url,flags,targetframename,postdata,headers);
      end;
    end;
    procedure donewwindow2(var ppdisp: idispatch; var cancel: wordbool);
    begin
    end;
    procedure donavigatecomplete2(const pdisp: idispatch; var url: olevariant);
    begin
    end;
    procedure dodocumentcomplete(const pdisp: idispatch; var url: olevariant);
    begin
    end;
    procedure doonquit;
    begin
    end;
    procedure doonvisible(visible: wordbool);
    begin
    end;
    procedure doontoolbar(toolbar: wordbool);
    begin
    end;
    procedure doonmenubar(menubar: wordbool);
    begin
    end;
    procedure doonstatusbar(statusbar: wordbool);
    begin
    end;
    procedure doonfullscreen(fullscreen: wordbool);
    begin
    end;
    procedure doontheatermode(theatermode: wordbool);
    begin
    end;
    procedure buildpositionaldispids(pdispids: pdispidlist; const dps: tdispparams);
    var
      i: integer;
    begin
      assert(pdispids <> nil);
      for i := 0 to dps.cargs - 1 do
        pdispids^[i] := dps.cargs - 1 - i;
      if (dps.cnamedargs <= 0) then exit;
      for i := 0 to dps.cnamedargs - 1 do
        pdispids^[dps.rgdispidnamedargs^[i]] := i;
    end;
      

  5.   

    function tDnldSkin.invoke(dispid: integer; const iid: tguid; localeid: integer;
      flags: word; var params; varresult, excepinfo, argerr: pointer): hresult;
    type
      polevariant = ^olevariant;
    var
      dps: tdispparams absolute params;
      bhasparams: boolean;
      pdispids: pdispidlist;
      idispidssize: integer;
    begin
      result := disp_e_membernotfound;
      pdispids := nil;
      idispidssize := 0;
      bhasparams := (dps.cargs > 0);
      if (bhasparams) then
      begin
        idispidssize := dps.cargs * sizeof(tdispid);
        getmem(pdispids, idispidssize);
      end;
      try
        if (bhasparams) then buildpositionaldispids(pdispids, dps);
        case dispid of
          102:
            begin
              dostatustextchange(dps.rgvarg^[pdispids^[0]].bstrval);
              result := s_ok;
            end;
          108:
            begin
              doprogresschange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].lval);
              result := s_ok;
            end;
          105:
            begin
              docommandstatechange(dps.rgvarg^[pdispids^[0]].lval, dps.rgvarg^[pdispids^[1]].vbool);
              result := s_ok;
            end;
          106:
            begin
              dodownloadbegin();
              result := s_ok;
            end;
          104:
            begin
              dodownloadcomplete();
              result := s_ok;
            end;
          113:
            begin
              dotitlechange(dps.rgvarg^[pdispids^[0]].bstrval);
              result := s_ok;
            end;
          112:
            begin
              dopropertychange(dps.rgvarg^[pdispids^[0]].bstrval);
              result := s_ok;
            end;
          250:
            begin
              dobeforenavigate2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[2]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[3]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[4]].pvarval)^, polevariant(dps.rgvarg^[pdispids^[5]].pvarval)^, dps.rgvarg^[pdispids^[6]].pbool^);
              result := s_ok;
            end;
          251:
            begin
              donewwindow2(idispatch(dps.rgvarg^[pdispids^[0]].pdispval^), dps.rgvarg^[pdispids^[1]].pbool^);
              result := s_ok;
            end;
          252:
            begin
              donavigatecomplete2(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);
              result := s_ok;
            end;
          259:
            begin
              dodocumentcomplete(idispatch(dps.rgvarg^[pdispids^[0]].dispval), polevariant(dps.rgvarg^[pdispids^[1]].pvarval)^);
              result := s_ok;
            end;
          253:
            begin
              doonquit();
              result := s_ok;
            end;
          254:
            begin
              doonvisible(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
          255:
            begin
              doontoolbar(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
          256:
            begin
              doonmenubar(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
          257:
            begin
              doonstatusbar(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
          258:
            begin
              doonfullscreen(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
          260:
            begin
              doontheatermode(dps.rgvarg^[pdispids^[0]].vbool);
              result := s_ok;
            end;
        end;
      finally
        if (bhasparams) then freemem(pdispids, idispidssize);
      end;
    end;
    function tDnldSkin.getidsofnames(const iid: tguid; names: pointer;
      namecount, localeid: integer; dispids: pointer): hresult;
    begin
      result := e_notimpl;
    end;
    function tDnldSkin.gettypeinfo(index, localeid: integer;
      out typeinfo): hresult;
    begin
      result := e_notimpl;
      pointer(typeinfo) := nil;
    end;
    function tDnldSkin.gettypeinfocount(out count: integer): hresult;
    begin
      result := e_notimpl;
      count := 0;
    end;
    function tDnldSkin.getsite(const riid: tiid; out site: iunknown): hresult;
    begin
    //  result := s_ok;
      if assigned(ie) then result:=ie.queryinterface(riid, site)
       else
         result:= e_fail;
    end;
    function tDnldSkin.setsite(const punksite: iunknown): hresult;
    var
      cmdtarget: iolecommandtarget;
      sp: iserviceprovider;
      cpc: iconnectionpointcontainer;
      cp: iconnectionpoint;
    begin
      if assigned(punksite) then begin
        cmdtarget := punksite as iolecommandtarget;
        sp := cmdtarget as iserviceprovider;      if assigned(sp)then
            sp.queryservice(iwebbrowserapp, iwebbrowser2, ie);
          if assigned(ie) then begin
            ie.queryinterface(iconnectionpointcontainer, cpc);
            cpc.findconnectionpoint(dwebbrowserevents2, cp);
            cp.advise(self, cookie)
          end;
      end;
      result := s_ok;
    end;
    procedure tDnldSkinfactory.updateregistry(register: boolean);
    var
      s: string;
    begin
      inherited updateregistry(register);
      if register then
      begin
        s := guidtostring(class_DnldSkin);
        with tregistry.create do
        try
          rootkey := hkey_local_machine;
          openkey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s, true);
          RootKey:=HKEY_CLASSES_ROOT;
          OpenKey('\CLSID\'+s,False);
          WriteString('','DnldSkin');
        finally
          free;
        end;
      end
      else
      begin
        s := guidtostring(class_DnldSkin);
        with tregistry.create do
        try
          rootkey := hkey_local_machine;
          deletekey('software\microsoft\windows\currentversion\explorer\browser helper objects\' + s);
        finally
          free;
        end;
      end;
    end;
    initialization
      tDnldSkinfactory.create(comserver, tDnldSkin, class_DnldSkin,
        'DnldSkin', '', cimultiinstance, tmapartment);
    end.