2009-04-02 7 views
3

J'ai un programme qui utilise le contrôle C# WebBrowser et il doit détecter quelle page est chargée pour déterminer ce qu'il faut faire ensuite. Le programme fonctionne bien sur la plupart des ordinateurs des employés au bureau, mais il ne fonctionne pas sur certains.Le contrôle C# WebBrowser ne déclenche pas l'événement DocumentCompleted

J'ai déterminé que le problème est que l'événement documentCompleted ne se déclenche pas sur les ordinateurs sur lesquels il ne fonctionne pas.

Ce programme utilise des unités d'exécution pour traiter les données et l'appel webbrowser.navigate est effectué via un délégué. Mais j'ai également changé le code pour ne pas utiliser les délégués pour l'action de navigation sans changement dans le résultat.

J'ai aussi fait un programme distinct qui a juste un WebBrowser et le débogage textfield, et l'événement DocumentCompletedde base ne feu lors de l'utilisation de ce programme. REMARQUE: Les ordinateurs sur lesquels il ne fonctionne pas sont des ordinateurs plus anciens dotés de processeurs monotœurs/thread. Je n'ai plus d'idées sur celui-ci, toute aide serait appréciée.

Répondre

2

S'il s'agit d'un problème de thread, vérifiez que vous appelez Application.DoEvents(). J'ai eu des problèmes avec WebBrowser ne fonctionne pas correctement quand j'ai échoué à faire cela.

+0

Quand est-ce que je devrais faire cela? Après que le fil a fini de fonctionner? – user42931

+1

Très bien, juste essayé après que les discussions terminent leur travail. Pas de changement. Essayez également d'exécuter Application.DoEvents() sur une minuterie de 1 seconde. Pas de changement. :( – user42931

+0

Résolu mon problème – Auxiliary

3

Tout en essayant de résoudre this question, j'avais initialement mon contrôle WebBrowser dans un bloc using(), et il disposait lui-même avant que l'événement DocumentCompleted puisse se déclencher. Est-ce que vous faites quelque chose de similaire, ou le WebBrowser est-il sur un formulaire qui reste ouvert?

4

@Pavel L:

Le problème ici est que vous utilisez un contrôle de navigateur Web à partir mshtml.dll mais NET Framework n'inclut pas ce fichier. La solution pour cela est simplement de copier mshtml.dll dans votre répertoire d'application ou de définir la propriété 'Copy local' de Microsoft.mshtml sur True.

Désolé pour mon mauvais anglais: D

+0

+1 - Votre réponse est claire et concise –

6

Comme l'a expliqué codeblock, cela semble être lié par l'état d'installation de Microsoft.mshtml.dll

Nous avons des clients arrivés là où le Microsoft.mshtml.dll n'est pas présent dans GAC (ni dans l'ordinateur), puis le composant WebBrowser ne déclenche jamais d'événement.

En utilisant réflecteur dans la classe WebBrowser, l'événement DocumentComplete est soulevée par une sous-classe nommée WebBrowserEvent, qui mettent en œuvre une interface privée DWebBrowserEvents2.

Cette interface est une ComImport de {34A715A0-6587-11D0-924A-0020AFC7AC4D}, qui, je suppose, est liée à Microsoft.mshtml.dll.

Donc, notre solution était d'installer the Office 2003 Redistributable Primary Interop Assemblies, qui installe la DLL sur Program Files puis l'enregistrer sur le GAC.

Remarque: Ne faites pas attention au .NET Framework 1.1 requis ou bureau requis, il copie juste quelques DLL.

Note 2: Le 2007 package semble inclure la même DLL.

+0

Great .. Merci. – Sayka

1

Eh bien, je voudrais partager une solution encore plus simple plutôt que d'installer un paquet.

Comme il a été indiqué avant l'événement DocumentComplete dépend en quelque sorte du fichier Microsoft.mshtml.dll. Vous pouvez le trouver sur une machine avec Visual Studio installé. Il doit donc être copié et installé sur la machine cible. Voici la description du processus:

  1. Placez le fichier du Microsoft.mshtml.dll dans le dossier "% ProgramFiles% \ Microsoft.NET \ Primary Interop Assemblies".
  2. Puis faites-le glisser dans le dossier "% SystemRoot% \ Assembly".
  3. Enregistrez la bibliothèque avec l'utilitaire RegAsm.exe (qui se trouve dans le sous-dossier approprié de "% windir% \ Microsoft.NET \ Framework").

P.S. Peut-être que cela peut être fait d'une meilleure façon, mais cette solution fonctionne et j'espère que cela vous sera utile.

1

Pour que le documentCompleted-Event se déclenche, la propriété visible du navigateur Web doit être définie sur true pour
.

Il peut également être visible si vous avez plusieurs écrans.
Si vous avez> 1 écran, désactivez tout sauf l'écran principal, cela devrait résoudre le problème.
Vous pouvez également déplacer la fenêtre sur le deuxième écran.

0

Assurez-vous que webbrowser.Visible=true; cela fonctionne pour moi, j'ai eu des problèmes similaires précédemment.