2009-05-26 6 views
2

J'ai incorporé WebBrowser de .NET dans un formulaire qui a d'autres boutons.Comment se fait-il que mon code fonctionne quand j'utilise un MessageBox.Show() entre et ne fonctionne pas sans cela?

L'application que je développe n'utilise pas de clavier, mais utilise un écran tactile. Donc, il n'utilise réellement que la souris. Pour faire défiler le webbrowser vers le bas, j'ai fait deux boutons personnalisés. Lorsque je clique sur ces boutons, il devrait envoyer un coup de clé "PageDown" au navigateur, et le navigateur devrait faire défiler vers le bas.

Ainsi, le code de l'événement click est comme suit:

 theForm.Activate(); 
     Application.DoEvents(); 
     theBrowser.Focus(); 
     Application.DoEvents(); 
     SendKeys.Send(key); 

Où theForm 'est la forme et 'theBrowser' est l'instance du navigateur.

Donc quand je clique sur le bouton, rien ne se passe. Lorsque je clique sur le navigateur, puis sur le bouton, cela fonctionne. Mais je suis en train de me concentrer, n'est-ce pas? Et j'ai donné à l'application suffisamment d'espace pour définir le focus?

Mais maintenant, ce que je pense est étrange. Quand je mets un MessageBox.Show ("BONJOUR"); dans le code, comme ceci:

theForm.Activate(); 
    Application.DoEvents(); 
    theBrowser.Focus(); 
    MessageBox.Show("HELLO"); 
    Application.DoEvents(); 
    SendKeys.Send(key); 

... ça ne fonctionne quand je clique immédiatement le bouton.

& nbsp

La question est: Pourquoi ce code fonctionne pas quand je quitte le MessageBox.Show(), mais fait quand j'utilise le MessageBox.Show()?

Espoir vous pouvez aider, merci à l'avance ...

+0

Même si je laisse une page complètement chargée, la même chose se produit ... – Folkert

Répondre

1

Pour moi, cela semble être la mauvaise façon de procéder. Essayez quelque chose le long de ce C++ sample ou C# sample.

Au moins, soyez explicite à propos du HWND auquel vous envoyez le message si vous souhaitez simuler des appuis sur les touches.

+0

Cet échantillon de C# a vraiment beaucoup aidé! Je vous remercie! – Folkert

+0

Le lien de l'échantillon C# semble être rompu maintenant. – Troyen

1

Sans entrer dans si votre approche est correcte. (et je soupçonne que ce n'est pas le cas). Je parierais que vous avez une condition de concurrence. Ce qui signifie que le contrôle du navigateur a besoin de plus de temps pour charger et répondre aux événements que vous ne le laissez. Quand vous faites Message.Show, soudain le thread que vous envoyez les événements est bloqué et il laisse le contrôle du navigateur terminer l'initialisation ou autre chose.

D'après votre question, il est difficile de savoir si vous utilisez Mobile ou un ordinateur de bureau normal, car il existe de meilleures approches pour gérer le toucher. Regardez Window7 Api pour multi Touch ou WPF 4.0 (qui est également partagé par Surface Touch SDK).

Espérons que ça aide. Ariel

0

Il se peut que le contrôle du navigateur continue de charger un document et que la boîte de message lui laisse suffisamment de temps pour terminer. Si c'est le cas, attendez que la propriété IsBusy du navigateur soit false ou utilisez l'événement DocumentCompleted.

0

Je ne sais pas, mais en général, dans mon expérience, c'est une mauvaise idée d'essayer de changer la mise au point par programme de cette façon, vous vous retrouvez toujours sur une chasse aux bugs. Il y a beaucoup de façons de faire défiler les fenêtres, alors peut-être devriez-vous essayer autre chose? Par exemple JavaScript dans le navigateur Web peut faire défiler la fenêtre efficacement.

0

Je suppose que vous avez une course ici ce qui est fait en premier. La mise au point du contrôle peut ne pas être instantanée et la frappe que vous avez envoyée s'est déroulée ailleurs, alors qu'après avoir fermé la boîte de message, le contrôle du navigateur est déjà focalisé et obtient sa frappe.

En outre, pour citer une note de MSDN à propos Control.Focus():

Focus est une méthode à faible niveau destiné principalement aux auteurs de contrôle personnalisé. Au lieu de cela, les programmeurs d'application doivent utiliser la méthode Select ou la propriété ActiveControl pour les contrôles enfants ou la méthode Activate pour les formulaires.

L'utilisation de l'un de ceux-ci pourrait être préférable à l'utilisation de Focus().

+0

Est-ce que Application.DoEvents() ne devrait pas s'en charger? Je veux dire, je l'ai compris entre les deux, il a donc eu le temps de se concentrer sur le contrôle ... – Folkert