Detecter un evenement sous IE

[Résolu]
Signaler
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012
-
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012
-
Bonjour,

Je me perd un peu dans les termes BHO et ATL. Je veux juste créer un simple utilitaire permettant d'intercepter les événements d'une instance IE comme par exemple DocumentComplete.

Ma question est la suivante, comment je dois m'y prendre pour hooker une instance d'IE et la charger en tant qu'objet COM par exemple ce qui me permettrais d'intercepter tous les événements. Ceci à partir du handle de l'objet COM par exemple.

aKheNAtHoN

5 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tu as un handle de fenetre internet, pas une reference vers un objet COM....

ca marche pas ainsi
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
CopyMemory te permettra de piquer une reference vers ton objet COM

en gros :

Dim oIE As InternetExplorer
CopyMemory oIE, ByVal TonHandle, 4
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012

Voici le code écrit pour le test :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public WithEvents oIE As InternetExplorer

Private Sub Form_Load()
    Dim handleIE As Long
    handleIE = FindWindow("IEFrame", vbNullString)
    If handleIE <> 0 Then
        CopyMemory oIE, ByVal handleIE, 4
    Else
        MsgBox "Aucune instance IE lancée"
        End
    End If
End Sub

Private Sub oIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox URL
End Sub

Brèf, ça plante sans message d'erreur - détails du rapport d'erreur :

AppName: test.exe     AppVer: 1.0.0.0     ModName: ntdll.dll
ModVer: 5.1.2600.2180     Offset: 0000316c

Pb de partage de mémoire ? Sinon j'ai pensé à lancer dirrectement ie avec un shell - genre :

    Set oIE = New InternetExplorer

mais là on me dit le message d'erreur : la classe ne gére pas Automation ou l'interface attendue ...

Que faire ?

aKheNAtHoN
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012

J'ai parcontre toujours le même problème à moins que je pointe vers le mauvais handle :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public WithEvents oIE As InternetExplorer

Private Sub Form_Load()
    Dim handleIE As Long
    ' IE 7 COMPATIBLE ONLY
    handleIE = FindWindow("IEFrame", vbNullString)
    If handleIE <> 0 Then handleIE = GetHwndFromWay("TabWindowClass/Shell DocObject View/Internet Explorer_Server", handleIE)
    If handleIE <> 0 Then
        CopyMemory oIE, ByVal handleIE, 4
    Else
        MsgBox "Aucune instance IE lancée"
        End
    End If
End Sub

Private Sub oIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox URL
End Sub

Private Function GetHwndFromWay(way As String, parent As Long) As Long
    Dim classes() As String
    Dim i As Integer
    Dim hwnd As Long
    classes = Split(way, "/")
    hwnd = parent
    For i = 0 To UBound(classes)
        hwnd = FindWindowEx(hwnd, ByVal 0&, classes(i), vbNullString)
        If hwnd = 0 Then
            GetHwndFromWay = 0
            Exit Function
        End If
    Next i
    GetHwndFromWay = hwnd
End Function

Il me retourne le handle de Internet Explorer_Server et je pense que ce doit être la référence de l'objet COM. En tout cas pas de message d'erreur mais un méchant plantage de VB.

aKheNAtHoN
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012

CopyMemory n'attend peut-être pas un handle mais l'adresse d'un pointeur en mémoire. Si oui comment le récupérer, et est-ce que l'objet étant dans une autre appli j'ai le droit avec copymemory d'y accéder ...

Tu lances un IE tout simplement, tu lances vb d'un autre côté. Faut que vb fasse un subclassing ou autre sur les événements de cet objet com. Pour ça je pensais que seul en faisant un hook sur l'appli il étais possible d'intercepter les messages mais c'est galère et c'est pas documenté au niveau des constantes. En plus il faut obligatoirement une dll en C++ qui fasse le lien entre les deux.

Y'à pas un moyen simple de le faire sans avoir à déclarer 10000 fonctions ?

aKheNAtHoN