2009-03-15 5 views
0

Nehmen wir an, ich habe Internet Explorer in einem Windows-Formular eingebettet und navigiere dann zu einer zufälligen Seite im Web. Wie kann ich feststellen, wann eine Textbox (oder ein anderes Steuerelement, das eine Texteingabe akzeptieren kann) zum Fokusobjekt wird? Grundsätzlich kann ich bei jedem Mausklick überprüfen, ob das Objekt im Fokus ein Textfeld oder ein anderes Steuerelement für die Texteingabe ist, und dann entsprechend handeln.So ermitteln Sie, ob ein Textfeld in einem Windows-Formular den Fokus hat

Vielen Dank im Voraus,

Bob

+0

Was ist die Verbindung mit dem Web-Browser? Möchten Sie HTML-Elemente oder WinForm-Steuerelemente finden? –

+0

WinForm-Steuerelemente. – Beaker

+0

während Sie über eine Antwort (und setzen alte Frage zurück) und öffnen Sie dann eine neue Frage, so dass die anderen Antworten Sinn ergeben, wenn sie nicht aktualisiert werden – TStamper

Antwort

1

Sie haben erklärt noch nicht die Rolle des Web-Browsers, aber das Problem der Eingabefokus-Tracking zu sein scheint. Ich kenne kein Ereignis auf Formularebene, aber Sie können einen Eventhandler mit dem Enter- oder GotFocus-Ereignis aller relevanten Steuerelemente verknüpfen.

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


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

Ich bekomme ein Handle mit dem ActiveX IE Browser-Steuerelement, dass ist in ein Windows-Formular eingebettet und verwendet dann dieses Handle, um Eingaben an das Browser-Steuerelement zu senden, beispielsweise um programmtechnisch auf einen bestimmten Ort zu klicken. Ihre Lösung könnte für mich funktionieren. Ich werde es ausprobieren, dann überprüfen Sie es als die Antwort, wenn es tut – Beaker

+0

Dies funktioniert nur für Winform-Steuerelemente. Dies funktioniert nicht für die MSHTML-Steuerelemente innerhalb des Webbrowsers, was meiner Meinung nach das ist, was das OP verlangt. –

+0

@jeffamaphone: siehe die Kommentare unter dem OP. –

0

Ich glaube, was wollen Sie das HTMLTextContainerEvents2 dispinterface zu tun ist, sinken und zu onFocus (und möglicherweise onBlur) reagieren.

Sie haben Recht, dass Sie die Interop über Pinvoke selbst tun müssen. Ich nehme an, Sie können IHTMLElement Zeiger auf alle Objekte erhalten, die Sie verfolgen möchten (indem Sie getElementsByTagName oder etwas ähnliches verwenden). Sobald Sie das haben,

  1. Abfrage der IHTMELemnt für IConnectionPointContainer.
  2. Anruf IConnectionPointContainer :: Findconnectionpoint (DIID_DHTMLTextContainerEvents2)
  3. Anruf IConnectionPoint :: Advise() auf der IConnectionPoint in Schritt 2 erhaltenen
  4. Und natürlich müssen Sie IDispatch :: Invoke() implementieren, die Ihr Rückruf wird .
  5. Griff DISPID_HTMLELEMENTEVENTS2_ONFOCUS usw.
+0

Und vergessen Sie nicht, die Verbindung zu trennen, wenn Sie fertig sind. –

+0

Bis jetzt habe ich SendInput und SendMessage verwendet, um eine Menge Funktionalität zu erreichen. Ich würde eine Antwort bevorzugen, die ein Handle mit dem IE-Steuerelement enthält. Ich versuche nur, auf die Windows-Steuerelemente in der IE-Steuerung zu arbeiten, also glaube ich nicht, dass irgendwelche speziellen IE-Objekte erforderlich wären. – Beaker

+0

Nun, das sind keine Windows-Steuerelemente in der IE-Steuerung. MSHTML gibt alle seine eigenen Steuerelemente (außer Combobox auf IE6). Sie können diese Steuerelemente also nicht einfach nur behandeln, da sie keine Handles haben. Sie können mit spy ++ überprüfen. –

Verwandte Themen