포함 된 WPF WebBrowser 컨트롤에서 팝업을 허용하는 방법이 있습니까? 나는 elses 솔루션이나 팝업을 허용하는 COM 인터페이스를 찾을 수 없었습니다.WPF WebBrowser에서 팝업 허용
응용 프로그램이 ClickOnce를 통해 배포되기 때문에 사용자 레지스트리 설정을 변경하거나 유사한 침입 방법을 사용하고 싶지 않습니다.
포함 된 WPF WebBrowser 컨트롤에서 팝업을 허용하는 방법이 있습니까? 나는 elses 솔루션이나 팝업을 허용하는 COM 인터페이스를 찾을 수 없었습니다.WPF WebBrowser에서 팝업 허용
응용 프로그램이 ClickOnce를 통해 배포되기 때문에 사용자 레지스트리 설정을 변경하거나 유사한 침입 방법을 사용하고 싶지 않습니다.
기본 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
으로 비활성화 할 수 있습니다. 나는 그 장소를 직접 시험하지 않았다.
이것은 유용한 스 니펫 일 수 있지만 불행히도이 특정 문제를 해결하지는 못합니다. 페이지가 팝업을 열려고 할 때'NewWindow2' 나'NewWindow3' 이벤트는 발생하지 않습니다. 팝업 페이지 탐색을 시도하고 새 창 이벤트가 발생하지 않기 전에 팝업 차단이 시작됩니다. IE에서 팝업 차단기를 사용하지 않으면 제대로 작동하지 않습니다. 기록을 위해 Windows 8.1 및 IE11을 사용하므로 이전 버전에서는 동작이 다를 수 있습니다. –
@ NikolaRadosavljević, 업데이트 된 답변을 확인하십시오. – Noseratio
감사합니다. 내가 말했듯이 최종 사용자 설정 (레지스트리 수정)을 망칠 수 없기 때문에 불행히도이 기능을 사용할 수 없지만 그러한 제한이없는 사람들에게는 도움이 될 수 있으므로이 기능을 사용할 것입니다. –