C#WebBrowser控件未触发DocumentCompleted事件

时间:2009-04-02 18:35:37

标签: c# multithreading events browser

我有一个使用C#WebBrowser控件的程序,它需要检测加载哪个页面以确定下一步该做什么。该程序在办公室的大多数员工的计算机上运行良好,但在某些计算机上不起作用。

我已经确定问题是documentCompleted事件未在那些无效的计算机上触发。

此程序使用线程处理数据,webbrowser.navigate调用是通过委托进行的。但我也改变了代码,不使用委托进行导航操作而不改变结果。

我还制作了一个单独的程序,它只有一个基本WebBrowser和调试textfield,而DocumentCompleted事件在使用该程序时触发。< / p>

注意:未启动的计算机是具有单核/线程处理器的旧PC。

我对这个问题缺乏想法,任何帮助都会受到赞赏。

7 个答案:

答案 0 :(得分:6)

正如CodeBlock所解释的那样,这似乎与Microsoft.mshtml.dll

的安装状态有关

我们有客户在GAC(也不是计算机)中没有Microsoft.mshtml.dll,然后WebBrowser组件永远不会触发任何事件。

通过在WebBrowser类中使用Reflector,DocumentComplete事件由名为WebBrowserEvent的子类引发,该子类实现了专用接口DWebBrowserEvents2

此界面是ComImport的{​​{1}},我认为它与Microsoft.mshtml.dll有关。

所以我们的解决方案是安装the Office 2003 Redistributable Primary Interop Assemblies,在程序文件上安装DLL,然后在GAC上注册。

注意:不要注意所需的.NET Framework 1.1或办公室,它只是复制一些dll。

注意2:2007 package似乎包含相同的dll。

答案 1 :(得分:4)

@Pavel L:

这里的问题是您使用了mshtml.dll的Web浏览器控件,但.NET框架不包含此文件。解决方法是将mshtml.dll复制到您的应用目录或将Microsoft.mshtml的“复制本地”属性设置为True。

抱歉我的英文不好:D

答案 2 :(得分:3)

在尝试解决this question时,我最初将我的WebBrowser控件放在using()块中,并且在DocumentCompleted事件触发之前它处理了自己。您是在做类似的事情,还是WebBrowser在一个保持开放的表格上?

答案 3 :(得分:2)

如果是线程问题,请确保调用Application.DoEvents()。当我没有做到这一点时,我遇到了WebBrowser无法正常工作的问题。

答案 4 :(得分:1)

我想分享更简单的解决方案而不是安装软件包。

正如在DocumentComplete事件之前所述,某种程度上取决于Microsoft.mshtml.dll文件。您可以在安装了Visual Studio的计算机上找到它。因此需要将其复制并安装到目标计算机上。以下是该过程的描述:

  1. 将Microsoft.mshtml.dll文件放入“%ProgramFiles%\ Microsoft.NET \ Primary Interop Assemblies”文件夹中。
  2. 然后将其拖放到“%SystemRoot%\ Assembly”文件夹中。
  3. 使用RegAsm.exe实用程序(位于“%windir%\ Microsoft.NET \ Framework”的相应子文件夹中)注册库。
  4. P.S。可能是以更好的方式完成,但这个解决方案有效,我希望它对你有用。

答案 5 :(得分:1)

为了使documentCompleted-Event触发,
Web浏览器的visible属性需要设置为true。

如果您有多个屏幕,它也可以是可见的 如果你有&gt; 1个屏幕,关闭除主屏幕以外的所有屏幕,这应该可以解决问题 或者,将窗口移动到第二个屏幕。

答案 6 :(得分:0)

确保webbrowser.Visible=true;这对我有用,我之前遇到过类似的问题。