J'essaie de trouver un moyen pour que mon programme sache quand un WebBrowser navigue et quand il ne l'est pas. C'est parce que le programme va interagir avec le document chargé via JavaScript qui sera injecté dans le document. Je n'ai aucun autre moyen de savoir quand il commence à naviguer que de gérer l'événement Navigating puisque ce n'est pas mon programme mais l'utilisateur qui va naviguer en interagissant avec le document. Mais alors, quand DocumentCompleted
se produit ne signifie pas nécessairement qu'il a fini de naviguer. J'ai été googler beaucoup et trouvé deux pseudo-solutions:Est-il possible de savoir avec certitude si un navigateur Web navigue ou non?
Vérifiez la propriété de WebBrowser ReadyState en cas
DocumentCompleted
. Le problème avec ceci est que si le document mais pas un cadre dans le document se charge, leReadyState
seraCompleted
même si le document principal n'est pas terminé.Pour éviter cela, ils conseillent de voir si le paramètre Url passé à
DocumentCompleted
correspond à la Url duWebBrowser
. De cette façon, je saurais queDocumentCompleted
n'est pas invoqué par une autre image dans le document.
Le problème 2 est que, comme je le disais, la seule façon que je dois savoir quand une page est en manipulant est naviguait l'événement Navigating
(ou Navigated
). Donc, si, par exemple, je suis dans Google Maps et que je clique sur Rechercher, Navigating
sera appelée, mais un cadre navigue; pas la page entière (sur le cas spécifique de Google, je pourrais utiliser la propriété TargetFrameName
de WebBrowserNavigatingEventArgs
pour vérifier si c'est un cadre qui navigue, mais les cadres n'ont pas toujours de noms). Donc après cela, DocumentCompleted
sera appelé, mais pas avec le même Url
que mon WebBrowser
s Url
parce que c'était juste un cadre celui qui a navigué, donc mon programme serait qu'il navigue encore, pour toujours.
L'ajout d'appels à Navigating
et la soustraction des appels à DocumentCompleted
ne fonctionneront pas non plus. Ils ne sont pas toujours les mêmes. Je n'ai pas trouvé de solution à ce problème depuis des mois déjà; J'ai utilisé les solutions 1 et 2 et j'espère qu'elles fonctionneront dans la plupart des cas. Mon plan était d'utiliser une minuterie au cas où une page Web a des erreurs ou quelque chose, mais je ne pense pas que Google Maps a des erreurs. Je pourrais toujours l'utiliser mais la seule solution la plus laide serait de graver mon PC.
Edit: Jusqu'à présent, c'est le plus proche que je dois une solution:
partial class SafeWebBrowser
{
private class SafeNavigationManager : INotifyPropertyChanged
{
private SafeWebBrowser Parent;
private bool _IsSafeNavigating = false;
private int AccumulatedNavigations = 0;
private bool NavigatingCalled = false;
public event PropertyChangedEventHandler PropertyChanged;
public bool IsSafeNavigating
{
get { return _IsSafeNavigating; }
private set { SetIsSafeNavigating(value); }
}
public SafeNavigationManager(SafeWebBrowser parent)
{
Parent = parent;
}
private void SetIsSafeNavigating(bool value)
{
if (_IsSafeNavigating != value)
{
_IsSafeNavigating = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsSafeNavigating"));
}
}
private void UpdateIsSafeNavigating()
{
IsSafeNavigating = (AccumulatedNavigations != 0) || (NavigatingCalled == true);
}
private bool IsMainFrameCompleted(WebBrowserDocumentCompletedEventArgs e)
{
return Parent.ReadyState == WebBrowserReadyState.Complete && e.Url == Parent.Url;
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null) PropertyChanged(this, e);
}
public void OnNavigating(WebBrowserNavigatingEventArgs e)
{
if (!e.Cancel) NavigatingCalled = true;
UpdateIsSafeNavigating();
}
public void OnNavigated(WebBrowserNavigatedEventArgs e)
{
NavigatingCalled = false;
AccumulatedNavigations++;
UpdateIsSafeNavigating();
}
public void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e)
{
NavigatingCalled = false;
AccumulatedNavigations--;
if (AccumulatedNavigations < 0) AccumulatedNavigations = 0;
if (IsMainFrameCompleted(e)) AccumulatedNavigations = 0;
UpdateIsSafeNavigating();
}
}
}
SafeWebBrowser
WebBrowser
hérite. Les méthodes OnNavigating
, OnNavigated
et OnDocumentCompleted
sont appelées sur les méthodes surchargées WebBrowser
. La propriété IsSafeNavigating
est celle qui me ferait savoir si elle navigue ou non.
Mais même si JavaScript déclenche une navigation, les événements 'Navigating' et' Navigated' seront appelés. Je l'ai testé et ça a fonctionné de cette façon. Je ne comprends pas votre deuxième paragraphe. Qu'entendez-vous par "pendant que vous voulez faire quelque chose"? – Juan
@jsoldi j'ai peur FrankJK a tort, s'il y a une volonté, il y a un moyen. vous obtenez un repos de 5 secondes après que le document entier a été chargé pour attendre les redirections de JavaScript, ou vérifiez-les après la fin du document (en vérifiant les événements) si un document est déclenché ou non. Je vais (maintenant) poster un message sur la façon dont vous pouvez surmonter certains de vos obstacles. –