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
Partager