gpt4 book ai didi

.net - 允许 WPF WebBrowser 中的弹出窗口

转载 作者:行者123 更新时间:2023-12-04 02:31:30 29 4
gpt4 key购买 nike

有没有办法在嵌入式 WPF WebBrowser 控件中允许弹出窗口?我没有设法找到其他人的解决方案,也没有找到允许弹出窗口的 COM 接口(interface)。

我不想更改用户注册表设置或使用类似的侵入性方法,因为应用程序旨在通过 ClickOnce 进行分发。

最佳答案

您可以通过处理 NewWindow2 来实现自定义弹出窗口或 NewWindow3由底层 WebBrowser ActiveX 控件产生的事件。下面是如何执行此操作的一个非常基本的示例。它可以通过可重用的基于 WebBrowser 的控件得到进一步改进,以支持来自弹出窗口的弹出窗口。

已更新以解决评论。要禁用内置弹出窗口阻止程序,您需要为 FEATURE_WEBOC_POPUPMANAGEMENT 实现 WebBrowser 功能控制。 .您确实需要访问 Registry.CurrentUser 配置单元,但这不需要管理员权限。下面的代码展示了如何做到这一点。

using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Runtime.InteropServices;
using System.Diagnostics;
using Microsoft.Win32;


namespace WpfWbApp
{
public partial class MainWindow : Window
{
WebBrowser webBrowser;

public MainWindow()
{
SetBrowserFeatureControl();

InitializeComponent();

this.webBrowser = new WebBrowser();
this.Content = this.webBrowser;

this.Loaded += MainWindow_Loaded;
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var axWebBrowser = (SHDocVw.WebBrowser)GetActiveXInstance(this.webBrowser);
axWebBrowser.NewWindow2 += axWebBrowser_NewWindow2;

this.webBrowser.Navigate("http://example.com");
}

void axWebBrowser_NewWindow2(ref object ppDisp, ref bool Cancel)
{
var window = new Window { Width = 400, Height = 300 };
var newWebBrowser = new WebBrowser();
window.Content = newWebBrowser;
window.Show();
ppDisp = GetActiveXInstance(newWebBrowser);
}

/// <summary>
/// Get the underlying WebBrowser ActiveX object;
/// this code depends on SHDocVw.dll COM interop assembly,
/// generate SHDocVw.dll: "tlbimp.exe ieframe.dll",
/// and add as a reference to the project
/// </summary>
static object GetActiveXInstance(WebBrowser browser)
{
var document = browser.Document;

return browser.GetType().InvokeMember("ActiveXInstance",
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
null, browser, new object[] { }) as SHDocVw.WebBrowser;
}

/// <summary>
/// SetBrowserFeatureControlKey
/// </summary>
static void SetBrowserFeatureControlKey(string feature, string appName, uint value)
{
using (var key = Registry.CurrentUser.CreateSubKey(
string.Concat(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\", feature),
RegistryKeyPermissionCheck.ReadWriteSubTree))
{
key.SetValue(appName, (uint)value, RegistryValueKind.DWord);
}
}

/// <summary>
/// SetBrowserFeatureControl
/// </summary>
static void SetBrowserFeatureControl()
{
// http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx

// FeatureControl settings are per-process
var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);

// make the control is not running inside Visual Studio Designer
if (string.Compare(fileName, "devenv.exe", true) == 0 || string.Compare(fileName, "XDesProc.exe", true) == 0)
return;

// Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.
SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, 10000);

// Web Browser Control Popup Management
SetBrowserFeatureControlKey("FEATURE_WEBOC_POPUPMANAGEMENT", fileName, 0);
}
}
}

根据文档,也可以使用 CoInternetSetFeatureEnabled 禁用弹出窗口拦截器。和 FEATURE_WEBOC_POPUPMANAGEMENT , 通过 p/调用。我自己还没有尝试过那个 field 。

关于.net - 允许 WPF WebBrowser 中的弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470192/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com