Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Не работает кнопка <Enter> в WebBrowser


Автор: Poseidon 18.5.2005, 23:41
Html страницы, отображаемые в TWebBrowser часто имеют кнопки "Submit", и нажатие <Enter> не воспринимается непосредственно этой кнопкой. 

Код
unit Unit1; 

interface 

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

type 
  TForm1 = class(TForm) 
    WebBrowser1: TWebBrowser; 
    Button1: TButton; 
    Button2: TButton; 
    procedure FormDestroy(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
  private 
    { Private declarations } 
    FOleInPlaceActiveObject: IOleInPlaceActiveObject; 
    procedure MsgHandler(var Msg: TMsg; var Handled: Boolean); 
  public 
    { Public declarations } 
  end; 

var 
  Form1: TForm1; 


implementation 

{$R *.dfm} 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  FOleInPlaceActiveObject := nil; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Application.OnMessage := MsgHandler; 
end; 

procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean); 
var 
  iOIPAO: IOleInPlaceActiveObject; 
  Dispatch: IDispatch; 
begin 
  if not Assigned(WebBrowser1) 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)) then 
        //nothing - do not pass on Backspace, Left or Right arrows 
      else 
        FOleInPlaceActiveObject.TranslateAccelerator(Msg); 
  end; 
end; 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)