Detecter un evenement sous IE

Résolu
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012 - 11 juil. 2007 à 13:03
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012 - 11 juil. 2007 à 16:21
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 juil. 2007 à 14:35
tu as un handle de fenetre internet, pas une reference vers un objet COM....

ca marche pas ainsi
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 juil. 2007 à 13:26
CopyMemory te permettra de piquer une reference vers ton objet COM

en gros :

Dim oIE As InternetExplorer
CopyMemory oIE, ByVal TonHandle, 4
0
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
11 juil. 2007 à 13:54
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
0
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
11 juil. 2007 à 16:12
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aKheNathOn Messages postés 575 Date d'inscription dimanche 23 décembre 2001 Statut Membre Dernière intervention 23 octobre 2012
11 juil. 2007 à 16:21
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
0
Rejoignez-nous