我做了个IE toolbar其他都实现了,想增加拦截弹出窗口功能。我的IEBand实现了如下接口
TMyIEBand = class(TComObject,IDispatch,IDeskBand,IPersistStreamInit,IObjectWithSite,IInputObject)看了相关资料说实现IDispatch接口可以拦截弹出窗口根据资料我做的如下:
function TMyIEBand.GetTypeInfoCount(out Count: Integer): HResult;
begin
  Result := E_NOTIMPL;
end;
function TMyIEBand.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
  Result := E_NOTIMPL;
end;
function TMyIEBand.GetIDsOfNames(const IID: TGUID; Names: Pointer;NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL;
end;
function TMyIEBand.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
  dps: TDispParams absolute Params;
  bHasParams: boolean;
begin
  bHasParams := (dps.cArgs > 0);
  if(not bHasParams) then
  begin
    Result := E_INVALIDARG;
    Exit;
  end;
  try
    Result := S_OK;
    case DispId of
      107,251: //DISPID_NEWWINDOW,DISPID_NEWWINDOW2:
        begin
          if(BandForm.IEThis.ReadyState<>READYSTATE_COMPLETE) then
          begin
              // 禁止弹出窗口
              dps.rgvarg[0].pbool^ := true;
              //dps.rgvarg[0].vbool := true;
              BandForm.KillCount := BandForm.KillCount + 1;
              Result := S_OK;
          end
          else
          begin
              dps.rgvarg[0].pbool^ := false;
              Result := S_OK;
          end;
        end;
      103: //DISPID_QUIT:
        Result := S_OK;
    else
      begin
        Result := S_OK;
      end;
    end;
  finally
    
  end;
end;
可是无法拦截弹出窗口,是我那地方写的不对,或者路子错了,有那位朋友做过。高分请教。

解决方案 »

  1.   

    应该用TControl类的WndProc方法来实现吧
    procedure WndProc(var Message: TMessage); virtual;重载这个方法
      

  2.   

    比如
    procedure TmyEdit.WndProc(var Message: TMessage); 
    begin
      if Message.msg = wm_mousemove then
      begin
        cutrsor := crarrow;
        exit;
      end;
      if message.msg = wm_setFocus then
        exit;
      //屏蔽Wm_setFocus消息
      inherited wndproc(message);
    end;
      

  3.   

    我做的是拦截网页中的弹出窗口,这样做不太好啊。toolbar上有可以获得焦点按钮,输入框啊。窗口弹出后,toolbar这个东西有消息发过来吗。
      

  4.   

    看资料上很多都是在Invoke接口上实现,大家帮忙啊。
      

  5.   

    当连接建立成功后,ie在有事件引发后,会调用连接到自身的idispatch接口对象的invoke方法。不同的事件对应不同的dispid编码,我们可以在程序中判断dispid并做相应的处理。不好意思,只查到了这点资料,具体也没做过,顶下
      

  6.   

    107,251: //DISPID_NEWWINDOW,DISPID_NEWWINDOW2:
    我处理了这两个dispid编码,可是不管用啊,是我程序写的那里不对。或少处理了吗。
      

  7.   

    TOOLBAR做不到,要用BHO
    TOOLBAR只有在显示时才会被加载,弹出窗口一般不会有TOOLBAR,所以根本不会调用你的接口
    BHO是IE一打开就加载,这样才有可能.
      

  8.   

    不用讨论,你的方向错了,告诉你要用BHO,随便找个BHO的代码再实现就行了