Bonjour,

Sujet : Intercepter un msgbox (ou une fenêtre) externe

Contexte : le msgbox (ou une fenêtre) est lié à une appli extérieure à mon programme

Objectif : intercepter le msgbox (ou une fenêtre) et le fermer avant son affichage

Méthode : poser un hook WH_CBT sur l'appli créant le msgbox (ou une fenetre), intercepter le msgbox (ou une fenetre) avec le hook CBT_CREATEWND et empêcher le msgbox (ou une fenetre) de s'afficher.

J'ai réussis à poser le hook WH_CBT sur l'appli extérieure. J'arrive également à intercepter le msgbox (ou une fenetre) avant son affichage avec CBT_CREATEWND en récupérant son handle et son titre. Grace à l'handle récupéré de la msgbox (ou une fenetre) avant son affichage, je réussis à le fermer avec l'une des deux méthodes suivantes : soit en envoyant WM_CLOSE avec SendNotifyMessage, soit avec DestroyWindow. J'avoue que les deux ont le même effet : fermer le msgbox (ou une fenetre) avant de l'afficher. Mais à chaque fermeture du msgbox (ou une fenetre) avant affichage, le msgbox (ou une fenetre) est de nouveau créé afin d'être affiché. Du coup, le programme referme le msgbox (ou une fenetre) avant affichage mais le msgbox (ou une fenetre) est de nouveau créé, et ainsi de suite, formant une boucle infinie qui finit par faire crasher l'appli extérieur.

De plus, dans le hook WH_CBT / CBT_CREATEWND provoqué avant affichage du msgbox (ou une fenetre), je souhaite modifier les paramètres du msgbox (ou une fenetre) afin d'éviter qu'il soit créé, à l'aide des pointers types qui vont bien. Il s'agit du pointer type CBT_CREATEWND.lpcs et du pointer type CREATESTRUCT. Je les manipules avec succès, mais je n'arrive pas à annuler les paramètres de la msgbox (ou une fenetre) à créer.

Question : avec un hookt WH_CBT, comment empêchant l'affichage d'un msgbox (ou une fenetre) avant son affichage, sans créer cette boucle infinie (création, destruction, création, destruction...) ?

Mon code utilisé, qui est déclenché lors du hook "avant"

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Private Sub procWH_CBT(sWhen As String, lReturn As Long, nCode As eHookCode, wParam As Long, lParam As Long)
    Dim lCBT_CREATEWND As tCBT_CREATEWND
    Dim lCREATESTRUCT As tCREATESTRUCT
    Dim hNewWnd As Long
    Dim hwndParent As Long
    Dim Ret As Long
    Dim bRet As Boolean
    Dim TextLen As Long   
    Dim TitleBar As String 
    Dim sLength As Long   
    Dim iRetClose As Integer
 
 
    If sWhen = "Before" Then
 
        If nCode = HCBT_CREATEWND Then
 
            hNewWnd = wParam
 
            lCBT_CREATEWND = CopyMemoryGetCBT_CREATEWND(lParam)
            lCREATESTRUCT = CopyMemoryGetCREATESTRUCT(lCBT_CREATEWND.lpcs)
 
            hwndParent = lCREATESTRUCT.hwndParent
            bRet = IsWindow(lCREATESTRUCT.hwndParent)
 
            ' Name window of the parent
            TextLen = GetWindowTextLength(lCREATESTRUCT.hwndParent)
            TitleBar = Space$(TextLen + 1)
            sLength = GetWindowText(lCREATESTRUCT.hwndParent, TitleBar, TextLen + 1)
            TitleBar = Left(TitleBar, sLength)
 
            lCBT_CREATEWND.lpcs = 0
            ' replace lParam with 0
            CopyMemory ByVal lParam, lCBT_CREATEWND, LenB(lCBT_CREATEWND)
 
            iRetClose = SendNotifyMessage(hNewWnd, WM_CLOSE, 0, vbNullString)
            ' iRetClose = DestroyWindow(hNewWnd)
 
        End If
 
    End If
End Sub