Savoir si nouvelle fenètre est ouverte

Signaler
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
-
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
-
Encore bonjour, c'est encore moi !

(Je crois que je deviens accro à cppfrance ... faut que vous fassiez attention les nouveaux inscits, ça va très vite....)

J'aimerai pouvoir savoir quand une nouvelle fenètre s'ouvre !!!! (Et ensuite récupérer sa classe...)

Je suppose qu'il faut faire un hook global...

Une indication ?

Merci à tous ceux qui pourront me répondre...

26 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Exact, il faut faire un hook, de type WH_CBT:



LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)

{

if(nCode == HCBT_CREATEWND)

{

// Création d'une nouvelle fenêtre

}

return CallNextHookEx(hhk, nCode, wParam, lParam);

}
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Merci et quelle est la fonction qui appelle celle-ci ?

(hhk je suppose que c'est le hook ?)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est le système qui l'appelle bien entendu, sinon aucun intérêt
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Je fais ça :

SetWindowsHookEx( WH_CBT, (HOOKPROC) CBTProc, hExe, NULL);

Mais rien...

Où sont mes erreurs ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
hExe -> tu dois mettre l'instance de la DLL (ce code figure bien dans la dll?)
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Non j'ai fait un hook global sans DLL.....
Tout à refaire ou il y a une solution ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Autre solution, selon racpp. Jamais essayé, a toi de voir si ca marche:

http://www.cppfrance.com/code.aspx?ID=27169
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
C'est ce que j'ai fait mais ça marche pas....

La fonction n'est jamais appelée...

Par quoi puis-je remplacer hExe pour que cela fonctionne ?

Merci de ton aide
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Voilà j'ai créé la DLL comme ça :

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>



HHOOK hhk;
HINSTANCE hThisMod;


LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam);


__declspec (dllexport) int InitHook (void);
__declspec (dllexport) int EndHook (void);



LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode = = HCBT_CREATEWND)
{
ShellExecute(NULL, "open", "mon_programme.exe", 0, NULL, SW_SHOWNORMAL);
// Création d'une nouvelle fenêtre
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}


__declspec (dllexport) int InitHook ()
{
if (!hhk) hhk = SetWindowsHookEx (WH_CBT, (HOOKPROC)CBTProc, hThisMod, 0);
return 1;



}



__declspec (dllexport) int EndHook ()
{


if (hhk) {
UnhookWindowsHookEx (hhk);
return 1;
}
return 0;
}

Mais ça marche pas !!!!!!!!

Why ???
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu as regardé l'exemple que je t'ai donné.

Moi je fais avec une DLL, donc a la place de l'exe, on met l'instance de la DLL
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je vois pas de DllMain...

Tu dois initiliser hThisMod dans DllMain:



BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)

{

if(dwReason == DLL_PROCESS_ATTACH)

{

hThisMod = hDll;

DisableThreadLibraryCalls(hDll);

}

return 1;

}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
exemple complet ici:
http://www.cppfrance.com/code.aspx?id=17387

ciao...
BruNews, MVP VC++
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Oui voilà ce que j'avais oublié de montrer :

BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
hThisMod = hInst;
DisableThreadLibraryCalls(hInst);
break;


case DLL_PROCESS_DETACH:
break;


case DLL_THREAD_ATTACH:
break;


case DLL_THREAD_DETACH:
break;
}



return TRUE;
}

And it doesn't work ...

Il faut rajouter des options au compilateur ?
J'utilise Dev Cpp 4.9.9.2

Merci de ton aide en tt cas
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Ok je vais voir Brunew merci
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Dev me fais plein d'erreur...

Comment réussir à partir de mon code ?
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Ca marche mais à moitié :

Au début j'ai mis : hhk = SetWindowsHookEx (WH_SHELL, (HOOKPROC)CBTProc, hThisMod, 0);

LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam)
{
//Si un fenètre s'ouvre, ici, tout s'exécute !


if(nCode == HSHELL_WINDOWCREATED) {
//Ici rien ne se passe !!!
}

return CallNextHookEx(hhk, nCode, wParam, lParam);
}

Comment est-ce possible ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
hhk = SetWindowsHookEx(...)

hhk est bien != NULL ???

ciao...
BruNews, MVP VC++
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Oui j'ai vérifié il me renvoie 1 :

__declspec (dllexport) int InitHook ()
{
if (!hhk){

if ( (hhk = SetWindowsHookEx (WH_SHELL, (HOOKPROC)CBTProc, hThisMod, 0))==1 ) return 1;

}

return 0;
}
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Bref, par portions de code on y arrivera jamais :
Voilà mes 2 codes :

Celui de la DLL :

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


HHOOK hhk;
HINSTANCE hThisMod;


LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam);


__declspec (dllexport) int InitHook (void);
__declspec (dllexport) int EndHook (void);

<HR>



LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{

printf("***** Evenement *****\n");
if(nCode = = HSHELL_WINDOWCREATED)
{
printf("***** Fenetre ouverte *****\n");
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}

<HR>



__declspec (dllexport) int InitHook ()
{
printf( "***** Inithook *****\n" );
if (!hhk){
if ( (hhk = SetWindowsHookEx (WH_SHELL, (HOOKPROC)CBTProc, hThisMod, 0))= =1 ) return 1;
}
return 0;

}



<HR>

__declspec (dllexport) int EndHook ()
{
printf( "***** Endhook *****\n" );
if (hhk) {
UnhookWindowsHookEx (hhk);
return 1;
}
return 0;
}



<HR>

BOOL APIENTRY DllMain (HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
hThisMod = hInst;
DisableThreadLibraryCalls(hInst);
break;


case DLL_PROCESS_DETACH:
break;


case DLL_THREAD_ATTACH:
break;


case DLL_THREAD_DETACH:
break;
}


return TRUE;
}

<HR>

<HR>




Et celui de mon programme lanceur :

#include <stdio.h>
#include <stdlib.h>


int rep;
int InitHook (void);
int EndHook (void);


int main(int argc, char *argv[])
{
while (1) {
printf("1- Hook\n2- Endhook\n\n= => ");
scanf("%d", &rep);
if (rep 1) printf("Hook r\202pond> %d\n-----------------------------------\n", InitHook());

if (rep ==2) printf("Endhook r\202pond ==> %d\n-----------------------------------\n", EndHook());
}

return 0;
}


<HR>

Voilà voilà et les fonctions InitHook() et EndHook() me réponde aléatoirement 1 ou 0...
(Par exemple je fais InitHook() qui me renvoie 0 et ensuite EndHook() qui me renvoie 1...!!! )
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Je viens de me rendre compte que hhk ne "disparait" jamais meme si je fais UnHookWindowsHookEx(hhk) ...?