如何在没有 UI 的情况下创建 WebBrowser 控件 (ActiveX / IWebBrowser2)?

Posted

技术标签:

【中文标题】如何在没有 UI 的情况下创建 WebBrowser 控件 (ActiveX / IWebBrowser2)?【英文标题】:How can I create a WebBrowser control (ActiveX / IWebBrowser2) without a UI? 【发布时间】:2010-06-13 08:29:36 【问题描述】:

如果不在任务栏中创建一个窗口,我无法弄清楚如何使用 WebBrowser 控件。

我直接使用 IWebBrowser2 ActiveX 控件,因为我需要使用一些高级功能,例如阻止下载 JAVA/ActiveX/图像等。这显然在 WPF 或 winforms WebBrowser 包装器中不可用(但这些包装器确实有无需 UI 即可创建控件)

这是我创建控件的代码:

Type webbrowsertype = Type.GetTypeFromCLSID(Iid_Clsids.CLSID_WebBrowser, true);

m_WBWebBrowser2 = (IWebBrowser2)System.Activator.CreateInstance(webbrowsertype);
m_WBWebBrowser2.Visible = false;

m_WBOleObject = (IOleObject)m_WBWebBrowser2;
int iret = m_WBOleObject.SetClientSite(this);
iret = m_WBOleObject.SetHostNames("me", string.Empty);

tagRECT rect = new tagRECT(0, 0, 0, 0);
tagMSG nullMsg = new tagMSG();
m_WBOleInPlaceObject = (IOleInPlaceObject)m_WBWebBrowser2;

//INPLACEACTIVATE the WB

iret = m_WBOleObject.DoVerb((int)OLEDOVERB.OLEIVERB_INPLACEACTIVATE, 
        ref nullMsg, this, 0, IntPtr.Zero, ref rect);

IConnectionPointContainer cpCont = (IConnectionPointContainer)m_WBWebBrowser2; 

Guid guid = typeof(DWebBrowserEvents2).GUID;
IConnectionPoint m_WBConnectionPoint = null;
cpCont.FindConnectionPoint(ref guid, out m_WBConnectionPoint);

m_WBConnectionPoint.Advise(this, out m_dwCookie);

此代码运行良好,但它在任务栏中显示了一个窗口。如果我省略了 DoVerb(OLEDOVERB.OLEIVERB_INPLACEACTIVATE) 调用,则导航到网页无法正常工作。 Navigate() 不会下载页面上的所有内容,也不会触发 DocumentComplete 事件。如果我添加一个 DoVerb(OLEIVERB_HIDE),那么我会得到与省略 DoVerb(OLEDOVERB.OLEIVERB_INPLACEACTIVATE) 调用相同的行为。

这似乎是一个非常基本的问题,但我在任何地方都找不到任何示例。

【问题讨论】:

【参考方案1】:

检查BUG: DocumentComplete Does Not Fire When WebBrowser Is Not Visible中的环绕

【讨论】:

以上是关于如何在没有 UI 的情况下创建 WebBrowser 控件 (ActiveX / IWebBrowser2)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?

如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 个服务器?

如何在没有冻结UI的情况下使用加载屏幕正确暂停主线程直到满足条件,

如何在不阻塞 UI 的情况下创建 UIView

如何在不创建数组的情况下使用 NgFor 来生成矩阵 UI 模式

我们可以在没有 UIWindow 的情况下创建 iOS 应用吗?