[API HOOK] Empecher un msgbox de s'afficher

Signaler
Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour,


Sujet : Intercepter un msgbox externe

Contexte : le msgbox est lié à une appli extérieure à mon programme

Objectif : intercepter le msgbox et le fermer avant son affichage

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

J'ai réussis à poser le hook WH_CBT sur l'appli extérieure. J'arrive également à intercepter le msgbox avant son affichage avec CBT_CREATEWND en récupérant son handle et son titre. Grace à l'handle récupéré de la msgbox avant son affichage, je réussis à le fermer avec l'une des deux méthodes suivantes : soit en envoyant WM_CLOSE avec SendMessage, soit avec DestroyWindow. J'avoue que les deux ont le même effet : fermer le msgbox avant de l'afficher. Mais à chaque fermeture du msgbox avant affichage, le msgbox est de nouveau créé afin d'être affiché. Du coup, le programme referme le msgbox avant affichage mais le msgbox 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, je souhaite modifier les paramètres du msgbox 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 à créer avec ce code :

Private Sub procWH_CBT(sWhen As String, nCode As eHookCode, wParam As Long, lParam As Long)

Dim l_CBT_CREATEWND As tCBT_CREATEWND



' Récupère les paramètres caractérisant la fenêtre à créer et seront mis dans : l_CBT_CREATEWND.lpcs

CopyMemory l_CBT_CREATEWND, ByVal lParam, LenB(l_CBT_CREATEWND)



' Je souhaite détruire les paramètres de la fenêtre à créer comme ça :

l_CBT_CREATEWND.lpcs = 0 ' c'est du long

CopyMemory lParam, ByVal l_CBT_CREATEWND, LenB(l_CBT_CREATEWND)

' Mais cela ne fonctionne pas, aucune erreur dans mon programme et le msgbox sera de nouveau créé.


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

2 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
Tu ne pourras rien faire si, comme je le devine, l'application externe gère cette msgbox en boucle tant que la réponse attendue n'est pas une de celles acceptées
2 exemples tout bêtes avec vb6 :
Do While ret <> vbOK
ret = MsgBox("coucou", vbOKCancel)
Loop

Do While ret <> vbYes And ret <> vbNo
ret = MsgBox("coucou", vbYesNoCancel)
Loop

et ce ne sont que des exemples parmi d'autres possibles.
Et si cette msgbox est générée par un autre langage, ou encore qu'elle résulte d'une utilisation d'une fonction de l'Api de Windows, cela peut aller encore plus loin !
La seule possibilité que j'entrevois alors dans de tels cas, est que tu lui envoies toi-même (si tu le connais) le message attendu !

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Regarde par exemple cette discussion ==>
http://codes-sources.commentcamarche.net/forum/affich-10050944-desactiver-le-message-windows-smartscreen-sous-visual-basic
Il est à mon avis certain que Microsoft a mis en oeuvre ce qu'il fallait pour que la toute première fenêtre revienne en boucle si on la ferme par harponnage ou envoi de message de fermeture à partir de son handle. Le contraire serait assez surprenant.
La boucle de son affichage ne cessera que si l'utilisateur clique sur OK et tout (y compris l'appli à démarrer) s'arrêtera alors.
Si l'utilisateur clique sur "informations complémentaires", on arrive à une autre fenêtre Windows.
Ce n'est qu'un exemple de mise en place de ce genre de boucle parmi d'autres possibles, pour des raisons x ou y que seul le concepteur de l'appli qui affiche ce genre de fenêtre connaît. Il arrive même qu'il ne le fasse dans certains cas que pour assurer sa propre publicité. Il ne le fait alors (à son gré) que la toute première fois que son appli est lancée, ou que les x première fois, ou encore que tant que son appli est en démo (et cesse de le faire lorsque complètement "acquise"). Les "motivations" peuvent dans ce domaine être très diverses.
Les plus vicieux font en sorte que la boucle continue tant que n'est pas écrit sur le disque dur (dans un fichier ou dans la BDR) un "drapeau" que seul le clic attendu peut écrire.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.