在一个Form中,有一个CppWebBrowser,一个DBGrid,当CppWebBrowser获得焦点后,无论如何DBGrid都无法获得焦点,但Form中的其它控件却可以正常获得焦点,当其它控件获得焦点后,再点击DBGrid,则DBGrid可以获得焦点.
不知有没有朋友遇到过这样的问题?应如何解决

解决方案 »

  1.   

    看来是VCL的Bug
    提供一点线索:
    http://www.nldelphi.com/Forum/archive/?t-8256.html
      

  2.   

    var
      vDefInetExplorerServerProc: Pointer;function InetExplorerServerWndProc(
      hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    var
      vFormHandle: THandle;
      vForm1: TForm1;
    begin
      Result := CallWindowProc(vDefInetExplorerServerProc,
        hwnd, Msg, wParam, lParam);
      vFormHandle := hwnd;
      while GetParent(vFormHandle) <> 0 do vFormHandle := GetParent(vFormHandle);
      vForm1 := TForm1(FindControl(vFormHandle));
      case Msg of
        WM_SETFOCUS: vForm1.ActiveControl := vForm1.WebBrowser1;
        WM_DESTROY: SetWindowLong(hwnd, GWL_WNDPROC,
          Integer(vDefInetExplorerServerProc));
      end;
    end;procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    var
      vShellDocObjViewHandle: THandle;
      vInetExplorerServerHandle: THandle;
    begin
      vShellDocObjViewHandle := GetWindow(TWebBrowser(Sender).Handle, GW_CHILD);
      vInetExplorerServerHandle := GetWindow(vShellDocObjViewHandle, GW_CHILD);
      if Integer(@InetExplorerServerWndProc) <>
        GetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC) then
      begin
        Integer(vDefInetExplorerServerProc) :=
          GetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC);
        SetWindowLong(vInetExplorerServerHandle, GWL_WNDPROC,
          Integer(@InetExplorerServerWndProc));
      end;
    end;