2009-03-15 9 views
0

Disons que j'ai Internet Explorer intégré dans un formulaire Windows et puis naviguer vers une page aléatoire sur le web. Comment puis-je déterminer quand une zone de texte (ou tout autre contrôle pouvant accepter la saisie de texte) devient l'élément en question? Fondamentalement, chaque fois que l'on clique sur la souris, je peux vérifier si l'élément en question est une zone de texte ou un autre contrôle pour la saisie de texte, puis agir de manière appropriée.Comment déterminer si une zone de texte dans un formulaire Windows a le focus

Merci à l'avance,

Bob

+0

Quel est le lien avec le navigateur Web? Voulez-vous trouver des éléments HTML ou des contrôles WinForm? –

+0

Contrôles WinForm. – Beaker

+0

alors que diriez-vous de vérifier une réponse (et remettre l'ancienne question) et ensuite ouvrir une nouvelle question, alors les autres réponses auront un sens si elles ne sont pas mises à jour – TStamper

Répondre

1

Vous avez toujours pas expliqué le rôle du navigateur Web, mais le problème semble être suivi de la mise au point d'entrée. Je ne connais pas d'événement de niveau Form mais vous pouvez connecter un eventhandler à l'événement Enter ou GotFocus de tous les contrôles concernés.

// in Form_Load 
foreach (var control in this.Controls) control.Enter += OnEnterControl; 


private void OnEnterControl(object sender, EventArgs e) 
{ 
    focusControl = (sender as Control); 
} 
+0

Je reçois un contrôle sur le contrôle du navigateur IE activex est incorporé dans un formulaire Windows, puis en utilisant ce handle pour envoyer une entrée au contrôle du navigateur, par exemple pour cliquer sur un emplacement particulier par programmation. Votre solution pourrait fonctionner pour moi. Je vais l'essayer, puis le vérifier comme réponse – Beaker

+0

Ceci ne fonctionnera que pour les contrôles winform. Cela ne fonctionnera pas pour les contrôles MSHTML dans le webbrowser, ce que je pense est ce que le PO demande. –

+0

@jeffamaphone: voir les commentaires sous OP. –

0

Je crois que ce que vous voulez faire est couler le HTMLTextContainerEvents2 dispinterface et répondre à onFocus (et potentiellement onBlur).

Vous avez raison de dire que vous devrez vous-même faire l'interoption via PinVoke. Je suppose que vous pouvez obtenir des pointeurs IHTMLElement à tous les objets que vous voulez suivre (en utilisant getElementsByTagName ou quelque chose de ce genre). Une fois que vous avez cela,

  1. Interrogez le IHTMLElemnt pour IConnectionPointContainer.
  2. Appel IConnectionPointContainer :: FindConnectionPoint (DIID_DHTMLTextContainerEvents2)
  3. Appel IConnectionPoint :: Advise() sur le IConnectionPoint obtenu à l'étape 2.
  4. Et bien sûr, vous avez besoin de mettre en œuvre IDispatch :: Invoke() qui sera votre rappel .
  5. poignée DISPID_HTMLELEMENTEVENTS2_ONFOCUS, etc.
+0

Et n'oubliez pas de vous déconnecter lorsque vous avez terminé. –

+0

Jusqu'à présent, j'ai utilisé SendInput et SendMessage pour obtenir beaucoup de fonctionnalités. Je préférerais une réponse qui implique l'utilisation d'un handle pour le contrôle IE. Je cherche juste à opérer sur les contrôles de Windows dans le contrôle IE donc je ne pense pas que des objets IE spéciaux seraient nécessaires. – Beaker

+0

Eh bien, ce ne sont pas des contrôles Windows dans le contrôle IE. MSHTML rend tous ses propres contrôles (sauf combobox sur IE6). Vous ne pouvez donc pas obtenir des poignées pour ces contrôles, car ils n'ont pas de poignées. Vous pouvez utiliser spy ++ pour vérifier. –