Delphi 我如何阻止Chromium创建一个;WebViewHost“;启动用户时的主机窗口';默认的web浏览器是什么?

Delphi 我如何阻止Chromium创建一个;WebViewHost“;启动用户时的主机窗口';默认的web浏览器是什么?,delphi,shellexecute,chromium,delphi-6,Delphi,Shellexecute,Chromium,Delphi 6,我在Delphi6应用程序中使用Chromium web浏览器控件 每当用户单击当前显示的网页中不在我的主网站上的web链接时,我都会使用带有“打开”动词的Windows ShellExecute()函数打开URL,从而启动带有URL的默认web浏览器。我通过BeforeBrowse()事件处理程序执行此操作,同时取消导航 换句话说,我不在Chromium控件中显示外部URL,而是在用户的默认web浏览器中显示它们 它工作正常,但有时我也会得到一个由我的应用程序拥有的独立窗口弹出窗口,它占据了大

我在Delphi6应用程序中使用Chromium web浏览器控件

每当用户单击当前显示的网页中不在我的主网站上的web链接时,我都会使用带有“打开”动词的Windows ShellExecute()函数打开URL,从而启动带有URL的默认web浏览器。我通过
BeforeBrowse()
事件处理程序执行此操作,同时取消导航

换句话说,我不在Chromium控件中显示外部URL,而是在用户的默认web浏览器中显示它们

它工作正常,但有时我也会得到一个由我的应用程序拥有的独立窗口弹出窗口,它占据了大约一半完全空的屏幕(带有Windows主题的白色空白客户端区域)。窗口的Windows类名为“webviewhost”


有人能告诉我如何抑制这个“重影”窗口吗?

这里的问题是弹出窗口。它们是在触发事件之前创建的,您可以取消它们的导航,使它们看起来像重影

您可以通过将事件的结果设置为True来阻止它们的创建,但这将结束导航,因此不会触发。如果你遵循这种方式,那么你也必须在事件中执行你的操作

procedure TForm1.Chromium1BeforePopup(Sender: TObject;
  const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
  var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
  out Result: Boolean);
begin
  // you can set the Result to True here and block the window creation at all,
  // but then you will stop also the navigation and the OnBeforeBrowse event
  // won't be fired, so if you will follow this way then you'll have to perform
  // your ShellExecute action here as well

  if url <> 'http://www.yourdomain.com' then
  begin
    Result := True;
    ShellExecute(Handle, 'open', PChar(url), '', '', SW_SHOWNORMAL);
  end;
end;
下面的代码是对您的问题的模拟(以页面下部的链接为例,单击该链接将打开弹出窗口)

procedure TForm1.Chromium1BeforePopup(Sender: TObject;
  const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
  var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
  out Result: Boolean);
begin
  // you can set the m_bWindowRenderingDisabled flag to True here what should
  // prevent the popup window to be created and since we don't need to take
  // care about substitute parent for popup menus or dialog boxes of this popup
  // window (because we will cancel the navigation anyway) we don't need to set
  // the WndParent member here; but please check if there are no resource leaks
  // with this solution because it seems more that the window is just hidden

  if url <> 'http://www.yourdomain.com' then
    windowInfo.m_bWindowRenderingDisabled := True;
end;
uses
  ShellAPI, ceflib, cefvcl;

const
  PageURL = 'http://www.htmlcodetutorial.com/linking/linking_famsupp_72.html';
  PopupURL = 'http://www.htmlcodetutorial.com/linking/popupbasic.html';

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chromium1.Load(PageURL);
end;

procedure TForm1.Chromium1BeforeBrowse(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  const request: ICefRequest; navType: TCefHandlerNavtype; isRedirect: Boolean;
  out Result: Boolean);
begin
  if request.Url = PopupURL then
  begin
    Result := True;
    ShellExecute(Handle, 'open', PChar(request.Url), '', '', SW_SHOWNORMAL);
  end;
end;

procedure TForm1.Chromium1BeforePopup(Sender: TObject;
  const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
  var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
  out Result: Boolean);
begin
{
  // Solution 1
  // this will block the popup window creation and cancel the navigation to
  // the target, so we have to perform the ShellExecute action here as well
  if url = PopupURL then
  begin
    Result := True;
    ShellExecute(Handle, 'open', PChar(url), '', '', SW_SHOWNORMAL);
  end;
}
{
  // Solution 2
  // or we can set the m_bWindowRenderingDisabled flag to True and the window
  // won't be created (as described in ceflib.pas), but the navigation continue
  if url = PopupURL then
    windowInfo.m_bWindowRenderingDisabled := True;
}
end;