我原来窗体中内置的webbrowser,操作其中的网页的时候,网页不相应回车事件
比如,访问mail.163.com,输入密码后回车,并不会进入邮箱,后来在网上找到解决方案
就是添加一个ApplicationEvents,
添加代码
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
const
  StdKeys = [VK_TAB, VK_RETURN]; { standard keys }
  ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended keys }
  fExtended = $01000000; { extended key flag }
begin
  Handled := False;
  with Msg do
    if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
      ((wParam in StdKeys) or {$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
      (wParam in ExtKeys) and ((lParam and fExtended) = fExtended)) then
    try
      if IsChild(WebBrowser1.Handle, hWnd) then
      { handles all browser related messages }
      begin
        with WebBrowser1.Application as IOleInPlaceActiveObject do
          Handled := TranslateAccelerator(Msg) = S_OK;
        if not Handled then
        begin
          Handled := True;
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;      end;
    except end;
end; // IEMessageHandler
结果这样网页可以解决响应回车的问题。
新的问题来了
当一个程序中,有两个form,form1 和form2,两个窗体都放置一个webbrowser,也都放置一个ApplicationEvents,添加一样的代码,form1为主窗体,
结果form1 中TAB键,和回车能有正常的效果
form2 中 回车也能有正常的效果,但是按TAB键,每次焦点不是移到下个控件,而是移到下下个控件
本例子程序下载地址 http://web.ppcol.com/test.rar 
(如果打不开上面的地址,我发邮件给大家,请留邮件)
请各位帮我啊

解决方案 »

  1.   


      public
        { Public declarations }
        procedure MsgHandle(var Msg :TMsg; var Handled :Boolean);
      end;var
      Form1: TForm1;
      FOleInPlaceActiveObject :IOleInPlaceActiveObject;implementation{$R *.DFM}procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean);
    var
     iOIPAO :IOleInPlaceActiveObject;
     Dispatch :IDispatch;
    begin
     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;
     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  else
       FOleInPlaceActiveObject.TranslateAccelerator(Msg);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     Application.OnMessage :=MsgHandle;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
     FOleInPlaceActiveObject :=nil;
    end;
      

  2.   

    参考这两个讨论:
    http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=73263
    http://delphi.ktop.com.tw/topic.asp?topic_id=52347