2014-01-31 3 views
2

포함 된 WPF WebBrowser 컨트롤에서 팝업을 허용하는 방법이 있습니까? 나는 elses 솔루션이나 팝업을 허용하는 COM 인터페이스를 찾을 수 없었습니다.WPF WebBrowser에서 팝업 허용

응용 프로그램이 ClickOnce를 통해 배포되기 때문에 사용자 레지스트리 설정을 변경하거나 유사한 침입 방법을 사용하고 싶지 않습니다.

답변

3

기본 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); 
     } 
    } 
} 

이 문서에 따르면, 팝업 차단은/호출 페이지를 통해 CoInternetSetFeatureEnabledFEATURE_WEBOC_POPUPMANAGEMENT으로 비활성화 할 수 있습니다. 나는 그 장소를 직접 시험하지 않았다.

+0

이것은 유용한 스 니펫 일 수 있지만 불행히도이 특정 문제를 해결하지는 못합니다. 페이지가 팝업을 열려고 할 때'NewWindow2' 나'NewWindow3' 이벤트는 발생하지 않습니다. 팝업 페이지 탐색을 시도하고 새 창 이벤트가 발생하지 않기 전에 팝업 차단이 시작됩니다. IE에서 팝업 차단기를 사용하지 않으면 제대로 작동하지 않습니다. 기록을 위해 Windows 8.1 및 IE11을 사용하므로 이전 버전에서는 동작이 다를 수 있습니다. –

+0

@ NikolaRadosavljević, 업데이트 된 답변을 확인하십시오. – Noseratio

+0

감사합니다. 내가 말했듯이 최종 사용자 설정 (레지스트리 수정)을 망칠 수 없기 때문에 불행히도이 기능을 사용할 수 없지만 그러한 제한이없는 사람들에게는 도움이 될 수 있으므로이 기능을 사용할 것입니다. –