2010-08-28 5 views
1

J'ai un contrôle de navigateur Web qui a navigué vers une page donnée et est prêt. Maintenant, je veux faire apparaître la boîte de dialogue Internet explorer find à chaque fois que l'utilisateur clique sur un bouton spécifique sur ma page. L'utilisateur peut déjà afficher la boîte de dialogue de recherche en cliquant sur 'ctrl + f', mais je veux aussi un bouton séparé pour cette action.Comment faire pour afficher Rechercher une boîte de dialogue à partir d'un contrôle de navigateur Web?

J'ai trouvé ceci: http://support.microsoft.com/kb/329014

Mais il les questions suivantes avec elle:

  1. La page dit que cette méthode ne fonctionne pas sur les versions ultérieures d'Internet Explorer:

    Avertissement Cet exemple utilise un GUID de groupe de commandes non documenté que est susceptible d'être modifié avenir. Bien que cet exemple a été testé à fonctionne correctement avec Internet Explorer 6 et plus tôt, il n'y a aucune garantie que ces techniques continueront à fonctionner avec succès dans les futures versions.

  2. Je ne peux pas compiler le code. J'ai ajouté les références décrites dans la page mais j'ai des erreurs en disant que l'espace de noms AxSHDocVw est introuvable.

Répondre

5

J'ai trouvé une solution moi-même: Si le nom de contrôle du navigateur web est "web", vous pouvez envoyer le "Crtl + f" pour avec le code suivant:

web.Focus(); 
SendKeys.Send("^f"); 

I testé ceci et il a soulevé la boîte de dialogue de recherche sur Internet Explorer 8.

+0

Ce code utilise également une touche de raccourci non documentée qui est susceptible de changer à l'avenir (bien que je doute que Microsoft le changera dans un avenir proche), et exige que le contrôle webbrowser ait le focus d'entrée. Il n'est pas si difficile d'appeler body.createtextrange, puis d'appeler findText et de sélectionner dans la zone de texte. –

+0

Ceci est une erreur débutant typique. Comment savez-vous que le raccourci pour "Rechercher" est toujours "F" dans toutes les langues? Ce peut être n'importe quelle autre lettre dans d'autres langues. – Elmue

1

J'utilise Windows7 et .Net4.0/WPF (pas Win Forms). La solution avec

web.Focus(); 
SendKeys.Send("^f"); 

n'a pas fonctionné pour moi. Tout d'abord, la commande send renvoie System.InvalidOperationException (en disant que mon application ne traite pas l'événement et que je devrais utiliser SendKeys.SendWait()). Deuxièmement, SendKeys.SendWait ("^ f") ne fait rien.

Ma solution nécessite de se concentrer la fenêtre du document au lieu de la fenêtre du navigateur:

System.Windows.Controls.WebBrowser HtmlView; //from xaml 
HTMLDocument HtmlDoc { get { return (HTMLDocument)HtmlView.Document; } } 
HtmlDoc.parentWindow.focus(); //when focusing this window sending Ctr-F has an effect 

Ensuite, j'utiliser keybd_event() pour envoyer le message clé

[DllImport("user32.dll")] 
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, 
           UIntPtr dwExtraInfo); 

byte vKey_f = 0x46; 
byte vKey_ctr = 0x11; 
byte f_down = 0x21; 
byte f_up = 0xa1; 
byte ctrl_down = 0x1d; 
byte ctrl_up = 0x9d; 
byte event_keyup = 0x0002; 

keybd_event(vKey_ctr, ctrl_down, 0, UIntPtr.Zero); // Ctrl Press 
keybd_event(vKey_f, f_down, 0, UIntPtr.Zero); // f Press 
keybd_event(vKey_f, f_up, event_keyup, UIntPtr.Zero); // f Release 
keybd_event(vKey_ctr, ctrl_up, event_keyup, UIntPtr.Zero); // Ctrl Release 

Pourquoi "^ f" ne travailler dans mon cas - je ne sais pas. Mais keybd_event() fonctionne bien, bien que msdn (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx) indique "Cette fonction a été remplacée, utilisez plutôt SendInput.". J'ai essayé SendInput() mais je n'ai pas pu voir un effet.

Plus d'infos à keybd_event():