精华内容
下载资源
问答
  • webbrowser控件事件

    千次阅读 2013-04-03 18:25:08
    Beforenavigate2: Fired before navigate occurs in the given WebBrowser(window or frameset element). The processing of this  navigation may be modified. (这个事件发生一个给定的浏览器即将导航到一个...
    Beforenavigate2: Fired before navigate occurs in the given WebBrowser(window or frameset element). The processing of this 
    navigation may be modified. (这个事件发生一个给定的浏览器即将导航到一个URL前,这个导航的过程可能会被修改.)

    ClientToHostWindow:   Fired to request client sizes be converted to host  window sizes
     (当控件用宿主窗体的客户区尺寸来改变自己的客户区时,会触发这个事件)
    CommandStateChange:  The endabled state of a command changed (一个可能的命令状态改变时)
    DocumentComplete: Fired when the document being navigated to reaches ReadyState_Complete.
     (当一个文档已经导航到了一个URL时会触发这个事件)
    DownLoadBegin: Download of a page started. ( 开始下载一个网页)
    DownLoadComplete: Download of page complete.( 结束下载一个网页)

    FileDownload: Fired to indicate the File Download dialog is opening. 
     (当【文件下载对话框】正在打开时会发送这个消息。)
    NavigateComplete2: Fired when the document being navigated to becomes visible and enters the navigation stack.
     (当文档已经导航到了,并且放到了历史记录堆栈时面时,会发生这个消息。)
     
    NavigateError: Fired when a binding error occurs(window or frameset element).
     (当导航发生错误时,会触发这个事件)

    NewWindow2: A new, hidden, non-navigated WebBrowser window is needed.
     (一个新的,隐藏,没有导航过的WebBrowser窗体被需要)
    NewWindow3: A new, hidden, non-navigated WebBrowser window is needed.
     (一个新的,隐藏,没有导航过的WebBrowser窗体被需要)
    OnFullScreen: Fired when fullscreen mode should be on/off ( 指示全屏模式是否被选用)
    OnMenuBar: Fired when the menubar should be shown/hide.( 指示菜单栏是否隐藏)
    OnQuit: Fired when application is quiting.( 当应用程序退出时,触发这个事件)

    OnStatusBar: Fired when the statusbar should be shown/hide.( 指示状态栏是否隐藏)

    OnTheaterMode: Fired when theater mode should be on/off. ( 指示剧场模式是否选用)

    OnToolBar: Fired when toolbar should be shown/hide. ( 指示工具栏是否隐藏)

    OnVisible: Fired when the window should be shown/hide. ( 指示窗体是否隐藏 )

    PrintTemplateInstantiation:  Fired when a print template is instantiated.( 指示一个打印模块被初始化好了)

    PrintTemplateTeardown: Fired when a print template destroyed.  (指示一个打印模块被销毁了)

    PrivacyImpactedStateChange: Fired when the global privacy impacted state changes.
     (指示一个全局私有的状态改变了)
    ProgressChange: Fired when download progress is updated. ( 指示下载进度更新)
    PropertyChange:  Fired when the PutProperty method has been called. ( 当PutProperty方法被调用)
    SetSecureLockIcon: Fired to indicate the security level of the current web page contents.
     (指示当前网页内容的安全级别)

    StatusTextChange:  Status text changed. ( 当状态栏文字改变时,触发这个事件)
    TitleChange: Document title changed. ( 文档标题改变时)

    UpdatePageStatus: Fired when a page is spooled, When it is fired can be changed by a custom template.
     (当一个网页假脱机,当一个用户模板改变)
    WindowClosing: Fired when the WebBrowser is about to closed by script.
    ( 当WebBrowser即将被脚本关闭)

    WindowSetHeight:  Fired when the host window should change its height.
     (当宿主窗体改变它的高度)
    WindowSetLeft:
     Fired when the host window should change its left coordinate. ( 当宿主窗体改变它的左坐标)

    WindowSetResizable: Fired when the host window should allow/disallow resizing. ( 当宿主窗体改变它的尺寸)

    WindowSetTop: Fired when the host window should change its Top coordinate.
     (当宿主窗体改变它的顶坐标)


    WindowSetWidth: Fired when the host window should change its width. ( 当宿主窗体改变它的宽度)
    展开全文
  • WebBrowser控件

    热门讨论 2013-05-04 17:48:40
    WebBrowser控件使用详解,js\vb\C#
  • 为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null? 问: 如何从WPF的WebBrowser控件中获得WebResponse内容?为何WebBrowser控件的Navigated事件

    [WPF - 之一问一答系列] 如何从WPF的WebBrowser控件中获得WebResponse内容?为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null?

    问:

    如何从WPF的WebBrowser控件中获得WebResponse内容?为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null?

     

    我们在一个WPF的WebBrowser的Navigated事件中,尝试去输出NavigationEventArgs e的WebResponse属性,他始终是null。比如,

    XAML代码: 
    <WebBrowser x:Name="browser"/>

    C#代码:

    browser.Navigated += new NavigatedEventHandler(browser_Navigated); 
    browser.Navigate(new Uri("http://www.microsoft.com"));

    //省略...

    void browser_Navigated(object sender, NavigationEventArgs e) 

       Console.WriteLine(e.WebResponse.Headers);  //输出null 
    }

    [相关MSDN英文贴:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/856608db-48ba-4492-bff1-3721618ff3ae]

    答:

    一般都会认为从WebBrowser中获得WebResponse内容,可以从Navigated事件的NavigationEventArgs参数中获得。但是,事实是这个参数始终在返回null值,导致无法真正获得返回的内容。

     

    解决这个问题,首先想到的是去了解WebBrowser控件的基本组成。我们知道,IE的结构是如下:Internet Explorer Architecture

    而对于一个WebBrowser控件(无论是Winform的还是WPF的),都是和这个架构类似的,不同的只是最上层的UI封装。控件来说,是没有IExplore.exe的包装的,所以一般控件就没有IE的某些特性,但是从底层来说,他们都使用了ShDocVw.dll和MSHTML.dll,控件只是对下方组件的一次封装。那么这个Navigated事件是从谁抛出的呢?答案是ShDocVw.dll,当然,面向不同的封装,抛到上方会遇到不同的处理。Wnform中的WebBrowserNavigatedEventArgs中没有封装WebResponse信息,而从WPF的WebBrowser中,却包含了这个属性。

    接下来,从表象很难找到原因了,这个时候就需要借助下工具,比如我使用了Reflector (从这里可以下载到试用版:http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1)去反编译了一些源代码,尝试去分析下为什么会一直返回null。通过工具分析,我们可以找到下面的一个调用列表:

    NavigationEventArgs类中的_webResponse成员实际就是我们要分析的对象,他仅由NavigationEventArgs的构造函数调用。而从他的构造函数的被调用列表中,我们发现了两类方法,一类是被定义在MS.Internal.Controls.WebBrowserEvent中的,还有是定义在System.Windows.Navigation.NavigationService中的。当然,我们可以想到,第一类是所谓WebBrowser控件的内部组件类,这个类实际就是所谓架构中对于ShDocVw.dll的一次.Net封装。所以这个类的方法就是WebBrowser在Navigated的时候调用的。点击显示MS.Internal.Controls.WebBrowserEvent.NavigateComplete2方法的逻辑代码:

    复制代码
    [SecurityTreatAsSafe, SecurityCritical]
    public void NavigateComplete2(object pDisp, ref object url)
    {
    //省略…
    NavigationEventArgs e = new NavigationEventArgs(uri, null, null, null, null, true);
    this._parent.OnNavigated(e);
    //省略…
    }
    复制代码

    可以看出,代码中直接使用null值构造了NavigationEventArgs参数,然后触发WebBrowser.Navigated事件。(当然,你也可以看DocumentComplete方法,在这个里面一样的用了null去构造后触发了WebBrowser.LoadCompleted事件)

    到此可以解释为什么WebResponse属性总是返回null了。

    等等,还没有结束。那么怎么去获得WebBrowser呢? 我们还省略没有去看另外的几个NavigationService的方法,比如System.Windows.Navigation.NavigationService.FireNavigated方法逻辑代码:

    复制代码
    private void FireNavigated(object navState)
    {
    object extraData = (navState is NavigateInfo) ? null : navState;
    try
    {
    NavigationEventArgs e
    = new NavigationEventArgs(this.CurrentSource, this.Content, extraData, this._webResponse, this.INavigatorHost, this.IsNavigationInitiator);
    //省略…
    }
    复制代码

    可以看出,NavigationService在他的事件中封装了WebResponse信息。这样的话,就有了解决方案——

    使用NavigationService去Navigate页面,并且在Navigated事件中获得。但是WebBrowser本身没有支持NavigationService,在WPF中只有NavigationWindowFrame支持了NavigationService,所以我们只需要使用这两者,这里我的代码是用了Frame替代了WebBrowser,

    XAML:

    <Frame x:Name="frame"/>

    C#代码:

    复制代码
    frame.Navigated += new NavigatedEventHandler(frame_Navigated);
    frame.NavigationService.Navigate(
    new Uri("http://www.microsoft.com"));

    //省略...

    void frame_Navigated(object sender, NavigationEventArgs e)

    {
    Console.WriteLine(e.WebResponse.Headers);
    }
    复制代码

    [备注:]在WebBrowser和Frame之间,我的第一感觉是,如果你需要一个浏览控件有依赖属性来支持绑定等WPF特性的话,那么就选择Frame吧,它包含你所需要的依赖属性,而WebBrowser没有。 不过我还会推荐下一个第三方的WPF浏览器控件:http://wpfchromium.codeplex.com/ 基于Google的Chromium项目的。

    展开全文
  • wpf webBrowser控件

    万次阅读 2018-04-12 09:28:24
    wpf webBrowser控件介绍WebBrowsers可以让我们在窗体中进行导航网页。 WebBrowser控件内部使用ie的引擎,因此使用WebBrowser我们必须安装ie浏览器(windows默认安装的)。使用直接在xmal中使用webBrowser控件...

    wpf webBrowser控件


    wpf webBrowser 的控件 坑太多了 不推荐使用, 推荐使用winform webbrowser
    在wpf中如何使用与扩展winform webbrowser,请看我的另一篇文章在wpf中使用winform webbrowser


    介绍

    WebBrowsers可以让我们在窗体中进行导航网页。
    WebBrowser控件内部使用ie的引擎,因此使用WebBrowser我们必须安装ie浏览器(windows默认安装的)。

    使用

    直接在xmal中使用webBrowser控件

    <WebBrowser x:Name="WebBrowser1" Source ="xxx.com"></WebBrowser>
    

    其中Source熟悉可以将webBrowser控件指向一个网页(也可以是本地文件的绝对路径)
    除了使用Source属性还有以下方法进行导航:

    方法 用法
    Navigate() 传入网页url WebBrowser1.Navigate(new Uri(address));
    NavigateToString 传入html页面内容WebBrowser1.NavigateToString("<html><body></body></html > ");
    GoBack() 导航到上一个文档,需要判断能否调用if (WebBrowser1.CanGoBack){WebBrowser1.GoBack();}
    GoForward 导航到下一个文档if (WebBrowser1.CanGoForward){WebBrowser1.GoForward();}
    事件 发生时间 用法
    Navigating 发生在导航到新的页面时发生,可以在这里取消导航 WebBrowser1.Navigating += (sender, args) ={args.Cancel = true;};
    Navigated 导航之后,在下载web页面之前引发 WebBrowser1.Navigated += (sender, args) =>{Console.WriteLine("ed" + args?.Uri);};
    LoadCompleteed 当web页面下载完成时引发这个事件,这时可以处理网页 WebBrowser1.LoadCompleted += (sender, args)=>{Console.WriteLine(WebBrowser1.Document);};

    问题

    • js报错
      默认情况下webBrowser用的是比较低的ie内核,这样如果访问的网页有不支持的脚本或者其他问题,就会没有办法正常运行,比如报错 javaScript错误。某些情况下使用ie可以打开的网页,在webBrowser需要管理员权限才可以正常打开,没有管理员权限也会报jabaScript错误。所以一般使用winForm的webBrowser,方便扩展,并且资料多。

      • 避免报错不弹提示框。
      WebBrowser1.Navigated += (sender, args) =>
      {
           SetSilent(wbMain, true)
      }   
      
      public static void SetSilent(WebBrowser browser, bool silent)
      {
          if (browser == null)
           throw new ArgumentNullException("browser");
      
          // get an IWebBrowser2 from the document
          IOleServiceProvider sp = browser.Document as IOleServiceProvider;
          if (sp != null)
          {
              Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
              Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
      
              object webBrowser;
              sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
              if (webBrowser != null)
              {
               webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
              }
          }
      }
      [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
      private interface IOleServiceProvider
      {
          [PreserveSig]
          int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject);
      }
      

      这种只是让它不出现报错窗口,不能从根本上解决。

      • 修改注册表使用新的ie内核,下面是代码:
       static void SetWebBrowserFeatures(int ieVersion)
          {
              if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                  return;
              var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
              UInt32 ieMode = GeoEmulationModee(ieVersion);
              var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";
              Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",
                  appName, ieMode, RegistryValueKind.DWord);
              Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",
                  appName, 1, RegistryValueKind.DWord);
          }
      
          static UInt32 GeoEmulationModee(int browserVersion)
          {
              UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode. 
              switch (browserVersion)
              {
                  case 7:
                      mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. 
                      break;
                  case 8:
                      mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. 
                      break;
                  case 9:
                      mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.                    
                      break;
                  case 10:
                      mode = 10000; // Internet Explorer 10.
                      break;
                  case 11:
                      mode = 11000; // Internet Explorer 11
                      break;
              }
              return mode;
          }
      

      比如你想使用最新的IE11

       SetWebBrowserFeatures(11);
      
      • 在网页中强制以ie最高级别的可用模式显示内容
      <meta http-equiv="X-UA-Compatible" content="edge" />
      
    • 内存泄漏
      Memory leak when using WPF WebBrowser control in multiple windows

      内存泄漏的解决方式

      • 不使用wpf中的 WebBrowser
      • 将WebBrowser放到子进程中,每次开关都会重新分配内存
      • 删除掉所有引用,来清理内存泄漏。关闭窗口时调用下面代码。
          public void Dispose()
          {
              webBrowser.Dispose();
      
              var window = GetWindowElement(webBrowser);
      
              if (window == null)
                  return;
      
              var field = typeof(Window).GetField("_swh", BindingFlags.NonPublic | BindingFlags.Instance);
      
              var valueSwh = field.GetValue(window);
              var valueSourceWindow = valueSwh.GetType().GetField("_sourceWindow", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(valueSwh);
              var valuekeyboardInput = valueSourceWindow.GetType().GetField("_keyboardInputSinkChildren", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(valueSourceWindow);
      
              var inputSites = valuekeyboardInput as IEnumerable<IKeyboardInputSite>;
      
              if (inputSites == null)
                  return;
      
              var currentSite = inputSites.FirstOrDefault(s => ReferenceEquals(s.Sink, webBrowser));
      
              if (currentSite != null)
                  currentSite.Unregister();
          }
      
          private static Window GetWindowElement(DependencyObject element)
          {
              while (element != null && !(element is Window))
              {
                  element = VisualTreeHelper.GetParent(element);
              }
      
              return element as Window;
          }
      
    展开全文
  • WebBrowser控件中ajax事件无法响应

    千次阅读 2018-08-30 07:45:24
    最近在做基于webbrowser的一些内容,但是webbrowser控件中的内容以及事件均是通过Ajax来加载的,导致无法响应 现阶段并没有好的解决方案,只有两个替代方案 ajax里面拼接的事件是跳转页面的 那这个比较简单,...

    最近在做基于webbrowser的一些内容,但是webbrowser控件中的内容以及事件均是通过Ajax来加载的,导致无法响应
    现阶段并没有好的解决方案,只有两个替代方案,发生此种现象的原因这个帖子
    https://bbs.csdn.net/topics/390212142?tdsourcetag=s_pcqq_aiomsg
    里面解释的是

    控件没有办法知道 javascript的事件,DocumentComplete也不会发生,只能自己写个Timer去检查内容是不是改变了。

    ajax里面拼接的事件是跳转页面的

    那这个比较简单,直接在你的div或者其他元素外层套一个a标签,利用a 标签的href标签来跳转

    ajax里面拼接的事件是执行事件的

    这样的话就没有办法,那只能在html中直接写入元素和事件,如果无法满足你 的要求,可以利用元素的显示和隐藏来解决html元素的问题

    变换形式的解决方案

    使用obj.innerHtml或者使用obj.html()来装载拼接的数据即可

    展开全文
  • WebBrowser控件使用

    千次阅读 2019-02-11 04:03:46
    WebBrowser控件属性: 1、Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,程序将返回WebBrowser控件的自动化对象 2、Parent 返回...
  • WebBrowser控件事件

    2015-03-05 11:00:22
    1、BeforeNavigate2 导航发生前激发,刷新时不激发 2、CommandStateChange 当命令的激活状态改变时激发。...4、DownloadBegin 当某项下载操作已经开始后激发,刷新也可激发此事件 5、DownloadCo
  • WebBrowser控件使用详解

    2011-09-18 13:10:14
    WebBrowser控件使用详解,WebBrowser控件使用详解
  • 扩展WebBrowser控件

    2019-04-23 23:38:30
    webBrowser控件功能进行了扩展,触发新窗口时,可获得真正的URL
  • 捕获 WebBrowser 控件的鼠标事件

    千次阅读 2011-04-02 07:26:00
     捕获 WebBrowser 控件的鼠标事件  VB 的网页浏览控件 WebBrowser 没有 MouseDown、MouseMove、MouseUp 等鼠标事件,要在程序中捕获这些事件,必须另想办法。本文使用注入 java 脚本的方法来捕获控件的...
  • 来自:斯克迪亚个人博客 ...摘要:WebBrowser控件的DocumentCompleted事件一般就被认定为是在页面完全加载完毕后产生,但事实却并非如此。首先它不一定会在完全加载完毕时才触发,有时就会在加载过程中就会触发。
  • Webbrowser控件详解

    2013-02-06 10:14:39
    Webbrowser控件详解大全,基本上常用功能都提供源码以及注释
  • 在VS2015中 新建一个对话框工程 添加一个webbrowser控件,对应添加一个控件变量,然后在程序初始化中添加CoInitializeEx(NULL, COINIT_MULTITHREADED), 编译可以通过。运行出错。 1.请问webbrowser控件如何可以在...
  • WebBrowser控件捕捉DHTML事件

    千次阅读 2004-05-17 17:48:00
    WebBrowser控件捕捉DHTML事件 SunHai 开发工具:Microsoft Visual Studio .NET 2003 操作系统:Windows XP 原文:http://www.devx.com/vb2themax/tip/18798  和其他控件一样,我们可以用WebBrowser控件来构筑...
  • WebBrowser 基于IE内核WebBrowser控件开发
  • WebBrowser控件中按下一个键的时候,PreviewKeyDown事件本来应该是只触发一次,但实际情况是引发了两次PreviewKeyDown事件, ms的网站上有人报告了这个bug,详见:...
  • WebBrowser 控件概述

    2011-12-12 11:44:03
    WebBrowser 控件概述(msdn介绍) WebBrowser 控件WebBrowser ActiveX 控件提供了托管包装。托管包装使您可以在 Windows 窗体客户端应用程序中显示网页。使用 WebBrowser 控件,可以复制应用程序中的 Internet ...
  • 用一个基本窗口MFC程序实现WebBrowser控件对指定网页页面的加载、展示、点击事件响应,以及实现对鼠标在页面中点击标签事件的捕获,并且返回标签的超链接。 在VS2010环境下编译通过。
  • 用一个基本窗口MFC程序实现WebBrowser控件对指定网页页面的加载、展示、点击事件响应,以及实现对鼠标在页面中点击标签事件的捕获,并且返回标签的超链接。
  • 5,实现点链接而不弹窗,右击WebBrowser控件选择属性,在相应属性面板中查看它所支持的事件,激活NewWindow事件,在事件函数中添加如下代码; private void webBrowser1_NewWindow(object sender, CancelEventArgs ...
  • 为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null? 我们在一个WPF的WebBrowser的Navigated事件中,尝试去输出NavigationEventArgs e的WebResponse属性,他始终是n...
  • 博客演示代码,演示了IE WebBrowser控件的基本使用,包括静态创建、动态创建和事件响应。
  • 近用到WebBrowser控件,遇到很多问题,也学习了不少新的东西。下面是我在C#下写的关于WebBrowser控件使用的代码。  1、WebBrowser常用属性 .Refresh();//刷新 .GoBack();//后退 .GoForward...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,950
精华内容 5,980
关键字:

webbrowser控件事件