Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Активизировать клавишу возврата для TWebBrowser

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Problem: 

  Web forms that have multi-line text boxes and/or Submit buttons do not 
  respond to the Enter key when displayed on a TWebbrowser. 
  Also when browsing local folders, some keys don't respond. 

  How to solve it: 
}

 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);
 const
   DialogKeys: set of Byte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN,
     $30..$39, $41..42, $44..$55, $57, $59..$5A];
 var
   iOIPAO: IOleInPlaceActiveObject;
   Dispatch: IDispatch;
 begin
   { exit if we don't get back a webbrowser object }
   if (WebBrowser1 = nil) then
   begin
     Handled := System.False;
     Exit;
   end;

   Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = System.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 in DialogKeys) then
         // nothing - do not pass on the DialogKeys 
      else
         FOleInPlaceActiveObject.TranslateAccelerator(Msg);
   end;
 end;

 initialization
   OleInitialize(nil);

 finalization
   OleUninitialize;
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay