Comment récupérer lien cliqué dans IE

Signaler
Messages postés
2
Date d'inscription
lundi 16 septembre 2013
Statut
Membre
Dernière intervention
16 septembre 2013
-
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
-
Je cherche désespérément récupérer le texte et la destination de chaque lien cliqué dans IE.
J'ai intercepté l'événement clic, je connais sa position.

Alors je suis très novice en vb.net et objet alors je tâtonne.

J'en suis la pour l'instant :

Dim eventObj As mshtml.IHTMLEventObj2 = CType(eventObject, mshtml.IHTMLEventObj2)
Dim PosX As Integer = eventObj.clientX
Dim PosY As Integer = eventObj.clientY
Dim elem As mshtml.IHTMLElement = Me.HTMLDocument.elementFromPoint(PosX, PosY)

If elem IsNot Nothing Then
Select Case True
Case TypeOf elem Is mshtml.IHTMLAnchorElement 'C'est un lien direct
Dim anchor As mshtml.IHTMLAnchorElement = CType(elem, mshtml.IHTMLAnchorElement)
Dim window As MyWinApiWindow = New MyWinApiWindow(Me.ParentHandle)
If System.Windows.Forms.MessageBox.Show(window, "Cet élément est dans une frame unique : " + elem.className + vbCrLf + "Label du lien cliqué : '" + elem.innerText + vbCrLf + "Pointe vers la page : " + anchor.href + vbCrLf + vbCrLf + "Do you want to continue?", Me.ModuleName, MessageBoxButtons.YesNo) = MsgBoxResult.No Then
e.Cancel = True
End If

Case TypeOf elem Is mshtml.HTMLFrameElementClass 'C'est une frame
'MessageBox.Show("Nom de la frame : " + elem.name) 'Affiche le nom de la frame
'Dim elem2 As mshtml.IHTMLElement = elem.contentWindow.document.body ' elem2 = frame en cours
'MessageBox.Show(elem2.elementFromPoint(PosX, PosY))

Dim docMain As mshtml.IHTMLDocument2
Dim frame As mshtml.IHTMLWindow2 = Nothing
Dim docInner As mshtml.IHTMLDocument2 = Nothing
Dim objIndx As Object = Nothing
Dim j As Integer
docMain = elem.document ' Super important
MessageBox.Show("Il y a " + Trim(Str(docMain.frames.length)) + " frames dans cette page")
For j = 0 To (docMain.frames.length - 1)
objIndx = j
frame = docMain.frames.item(objIndx)
MessageBox.Show(frame.name)
Next
If Not frame Is Nothing Then docInner = frame.document

Case Else 'C'est je ne sais pas quoi
MessageBox.Show("Je sais pas ce que c'est car c'est : " + TypeName(elem))
End Select
Else
MessageBox.Show("Rien de spé")
End If
End Sub

Le soucis c'est que lorsque c'est un lien simple je récupère bien le lien cliqué, mais dans une frame je n'arrive pas à gérer l'arborescence des infos par méconnaissance et donc de retrouver le lien comme lors d'une frame unique.

En fait je dois récupérer tout clic amenant à un saut à une nouvelle URL que ce soit du javascript ou autre.
Peut-être alors plutôt se servir de l'événement BeforeNavigate2 ?

Bref je rame grave.

Si quelqu'un a un début de piste ça me montrera vers ou creuser.

Merci d'avance

3 réponses

Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Bonjour (oui, on commence comme ça),

Il aurait été préférable d'utiliser la coloration syntaxique quand même.

If elem IsNot Nothing Then
Select Case True
Case TypeOf elem Is mshtml.IHTMLAnchorElement 'C'est un lien direct
Dim anchor As mshtml.IHTMLAnchorElement = CType(elem, mshtml.IHTMLAnchorElement) 


Euh, un IF n'était pas mieux ?

Les frames sont une pratique ancienne, il faudrait savoir pourquoi tu as besoin des frames.

Peut être voir ces quelques évènements :
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.control.locationchanged%28v=vs.85%29.aspx
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.webbrowser.navigated%28v=vs.85%29.aspx
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.webbrowser.navigating%28v=vs.85%29.aspx
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.webbrowser.newwindow%28v=vs.85%29.aspx
http://msdn.microsoft.com/fr-fr/library/system.windows.forms.webbrowser.progresschanged%28v=vs.85%29.aspx

Messages postés
2
Date d'inscription
lundi 16 septembre 2013
Statut
Membre
Dernière intervention
16 septembre 2013

Déjà merci beaucoup NHenry pour cette réponse rapide.
Oui j'ai pas été très malin pour la coloration, à vrai dire je n'avais pas percuté et je vais voir comment ça se goupille.

Ça m'aide déjà beaucoup ton code ça me permet d'avancer dans la compréhension du truc.

En fait je fais rien avec les frames. Les pages sur lesquelles je navigue ne sont pas de mon fait, il y en a donc qui ont des frames ou tout autres choses permettant différents affichages.

Je dois juste récupérer à chaque clic sur une page le nom du lien et l'url de destination mais ce pour n'importe quel lien, style javascript, image clicable bref n'importe quoi qui change l'URL de la page en cours.
Lorsque je ne peux pas récupérer le label du lien je dois le signaler en affichant les coordonnées cliquées (à priori ça je le récupère via l'événement OnClick c'est bon)

Je me dis que seul l'événement BeforeNavigate m'assure que je suis bien sur un clic lien.
Maintenant comment accéder à l'élément déclencheur en toute occasion même dans une frame ??

C'est la la question.
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
N'utilisant pas ce contrôle, je ne saurais t'en dire plus, désolé.