ActiveX Form失去焦点问题的解决

字体大小: 中小 标准 ->行高大小: 标准
unit Unit1; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, OleCtrls, SHDocVw_TLB,ActiveX; 

type 
  TForm1 = class(TForm) 
    Button1: TButton; 
    Edit1: TEdit; 
    WebBrowser1: TWebBrowser; 
    procedure Button1Click(Sender: TObject); 
    procedure FormActivate(Sender: TObject); 
    procedure FormDeactivate(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
  private 
    { Private declarations } 
  public 
  procedure MyMessageHandler(var Msg: TMsg; var Handled: Boolean); 

    { Public declarations } 
  end; 

var 
  Form1: TForm1; 
  FOleInPlaceActiveObject: IOleInPlaceActiveObject; 
  SaveMessageHandler: TMessageEvent; 


implementation 

{$R *.DFM} 

procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean); 
var 
  iOIPAO: IOleInPlaceActiveObject; 
  Dispatch: IDispatch; 
begin 
  { exit if we don't get back a webbrowser object } 
  if WebBrowser1 = nil then 
  begin 
    Handled := False; 
    Exit; 
  end; 

  Handled:=(IsDialogMessage(WebBrowser1.Handle, Msg) = True); 

  if (Handled) and (not WebBrowser1.Busy) then 
  begin 
    if FOleInPlaceActiveObject = nil then 
    begin 
      Dispatch := WebBrowser1.Application_; 
      if Dispatch <> nil then 
      begin 
        Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO); 
        if iOIPAO <> nil then 
          FOleInPlaceActiveObject := iOIPAO; 
      end; 
    end; 

    if FOleInPlaceActiveObject <> nil then 
      if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and 
         ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) 
  or (Msg.wParam = VK_RIGHT) or(Msg.wParam = VK_TAB)) then 
   //either write a message handler for the particular message or do 
     //nothing - do not pass on Backspace, Left or Right arrows or tab 
      else 
        FOleInPlaceActiveObject.TranslateAccelerator(Msg); 
  end; 
end; 

procedure TForm1.FormActivate(Sender: TObject); 
begin 
  SaveMessageHandler := Application.OnMessage; 
  Application.OnMessage := MyMessageHandler; 

end; 

procedure TForm1.FormDeactivate(Sender: TObject); 
begin 
Application.OnMessage := SaveMessageHandler; 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
Application.OnMessage := SaveMessageHandler; 
  FOleInPlaceActiveObject := nil; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var a,b,c,d:OleVariant; 
begin 
     WebBrowser1.Navigate(Edit1.Text,a,b,c,d); 
end; 

initialization 
  OleInitialize(nil); 

finalization 
  OleUninitialize; 

end. 

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68437.html