- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Delphi 6 应用程序中使用 Chromium Web 浏览器控件。
每当用户单击当前显示的网页中不在我的主网站上的 Web 链接时,我都会使用该 URL 启动他们的默认 Web 浏览器,方法是使用带有“的 Windows ShellExecute() 函数打开该 URL”打开'动词。我通过 BeforeBrowse()
事件处理程序执行此操作,同时取消导航。
换句话说,我不在 Chromium 控件中显示外部 URL,而是在用户的默认 Web 浏览器中显示它们。
它工作正常,但有时我也会弹出一个由我的应用程序拥有的独立窗口,它占据了大约一半的完全空白的屏幕(带有我的 Windows 主题的空白白色客户区域)。窗口的 Windows 类名称是“webviewhost”。
谁能告诉我如何抑制这个“幽灵”窗口?
最佳答案
这里的问题是弹出窗口。它们是在 OnBeforeBrowse
之前创建的事件被触发,您取消他们的导航,因此他们看起来像幽灵。
您可以通过设置OnBeforePopup
的结果来阻止它们的创建事件为 True,但这将结束导航,因此 OnBeforeBrowse
不会被解雇。如果您按照这种方式操作,那么您将必须执行 ShellExecute
行动于 OnBeforePopup
事件也是如此。
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;
另一种方法是设置 m_bWindowRenderingDisabled
OnBeforePopup
中标记为 True事件应该阻止创建弹出窗口(如 ceflib.pas
中所述,而不是在官方文档中,恕我直言,窗口已创建但保持隐藏,我希望这不会导致任何泄漏,尚未验证) )并且导航将继续,因此 OnBeforePopup
事件将被触发。
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;
以下代码是您的问题的模拟(以this tutorial
为例,页面下部的链接my popup
,如果您单击将打开弹出窗口)。
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;
关于delphi - 在启动用户的默认 Web 浏览器时,如何阻止 Chromium 创建 "WebViewHost"主机窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249863/
启用后 chrome://flags/#native-file-system-api在我的 chrome 83.0.4103.61 中,我尝试使用这个新 API 访问文件夹 handle = awai
我下载并开始玩 CEF,但似乎没有任何文档。甚至没有一个有效的维基……我错过了什么吗? 最佳答案 大多数文档都在 CEF 的 header files 中.二进制分发版附带从这些文件生成的文档。它在编
我正在尝试在 ubuntu 上构建 chromium,我遵循了 chromium 官方网站上的所有说明但是之后我遇到了一些错误 fetch --nohooks --no-history chromiu
我尝试使用命令ninja -C out/Debug chrome来编译Chromium。 但是错误消息显示: ninja error loading 'build.ninja': the system
有没有办法告诉Tampermonkey脚本在 Chromium 中运行使用亲属 @require文件路径?例如,如果我有以下脚本标题: // ==UserScript== // @name
在Qt5.2版本下,我使用的是QtWebView,它可以自动调用第三方扩展,支持avi、mpeg、mov、flv等视频格式。但是当我升级到Qt5.10,把QtWebView改成QtWebengineV
我认为这很容易,但我找不到任何指向简单 tar.gz/tar.bz2/zip 存档的链接。 Chrome 使用一些自定义工具,例如 build_depot甚至下载源代码。但是我不想编译源代码,我只想看
我尝试将 --ignore-gpu-blacklist 参数设置为 JCEF,但我找不到方法。我应该使用的方法是这样的:CefApp::onBeforeCommandLineProcessing(St
我尝试使用 update-alternatives 通过以下命令将 Chromium 设置为默认 Web 浏览器。虽然我成功地将'/snap/bin/chromium'添加到--config中,但它不
我在我们的应用程序中遇到了奇怪的行为,这是一个在 Android 上运行的 Phonegap 包装的 WebView。我不确定我是在查看错误还是可能有其他原因,因此提出了这个问题。 大约从 2013
背景 我的任务是用 Chromium 替换我们基于 IE 的打印逻辑,以便我们最终可以支持在 Windows Server Core 或可能支持 .Net Core 的其他操作系统上运行我们当前的服务
Electron 可以编译成操作系统,基于 Chromium 操作系统而不是 Chromium 浏览器吗?至少理论上是这样。 所以我可以在没有任何操作系统的情况下安装我的软件。它可以在类似 kiosk
如果我的计算机上运行多个不同的 native 应用程序,这些应用程序使用某种形式的嵌入式 Chromium(可以是 CEF、Electron 或类似的东西)是否有任何 Chromium 消息传递(进程
我在我的 .NET 应用程序中使用 Puppeteer Sharp 来执行一些网页自动化任务。但是,我必须在只能访问 Intranet 的环境中部署我的应用程序,这意味着 Puppeteer 的 Br
What settings can be modified/added, to optimize Firefox / Chromium for low memory/cpu systems su
What settings can be modified/added, to optimize Firefox / Chromium for low memory/cpu systems su
我有一个 RPi 4 在 kiosk 模式下运行,带有 7 英寸显示屏,它在启动时使用以下参数打开 Chromium(禁用捏合缩放和信息栏): chromium-browser --noerrdial
在 Ubuntu 18.04 上,我尝试创建一个提醒来提醒我每天跟踪我的工作日志。 创建sh文件put_hours.sh #!/bin/bash zenity \ --forms \
所以我尝试我的第一个 Chrome 构建只是为了好玩,我已经通过 gclient 配置和同步获得了我想要的所有文件。然而,没有VS可以打开的项目文件,只有一堆对我来说没用的.gyp文件。 命令“gcl
我创建了一个使用 Playwright 的 Azure 函数。它在本地工作,好吧,那部分不会改变) 然后我创建了 Azure DevOps 管道,因此它使用 Ubuntu 代理,使用 PLAYWRIG
我是一名优秀的程序员,十分优秀!