解决DCEF3 在 BeforePopup 事件中打开新窗体的问题

  • Post category:other

描述

在使用DCEF3(Delphi Chromium Embedded Framework 3)开发应用程序时,可能会遇到在BeforePopup事件中打开新窗体的问题。本攻略将介绍如何解决这个问题,包括两个示例说明。

解决方法

以下是“解决DCEF3在BeforePopup事件中打开新窗体的问题”的详细步骤:

  1. 在BeforePopup事件中设置Handled为True

在BeforePopup事件中,我们需要设置Handled为True,以防止DCEF3自动打开新窗体。示例代码如下:

procedure TForm1.Chromium1BeforePopup(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
  const userGesture: Boolean; var popupFeatures: TCefPopupFeatures;
  var windowInfo: TCefWindowInfo; var client: ICefClient;
  var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
  out Result: Boolean);
begin
  // 防止DCEF3自动打开新窗体
  Result := True;
end;
  1. 在BeforePopup事件中手动打开新窗体

在BeforePopup事件中,我们可以手动开新窗体,并将新窗体的句柄传递给DCEF3。示例代码如下:

procedure TForm1.Chromium1BeforePopup(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
  const userGesture: Boolean; var popupFeatures: TCefPopupFeatures;
  var windowInfo: TCefWindowInfo; var client: ICefClient;
  var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean;
  out Result: Boolean);
var
  NewForm: TForm;
  NewChromium: TChromium;
begin
  // 防止DCEF3自动打开新窗体
  Result := True;

  // 手动打开新窗体  NewForm := TForm.Create(nil);
  NewForm.Width := 800;
  NewForm.Height := 600;
  NewForm.Position := poScreenCenter;
  NewChromium := TChromium.Create(NewForm);
  NewChromium.Parent := NewForm;
  NewChromium.Align := alClient;
  NewChromium.Load(targetUrl);
  NewForm.Show;
  windowInfo.window_parent := NewForm.Handle;
end;

在上面的示例中,我们手动创建了一个新的窗体和一个新的Chromium控件,并将新窗体的句柄传递给DCEF3。

总结

在使用DCEF3开发应用程序时,可能会遇到在BeforePopup事件中打开新窗体的问题。我们可以通过设置Handled为True和手动打开新窗体的方式来解决这个问题。具体步骤如所述。在实际应用中,我们可以根据需要选择合适的方式和参数,以满足不同的需求。