Savoir si nouvelle fenètre est ouverte

Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
- - Dernière réponse : ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
- 11 juin 2005 à 16:18
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...
Afficher la suite 

20/26 réponses

Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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);

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

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

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

Mais rien...

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

http://www.cppfrance.com/code.aspx?ID=27169
Commenter la réponse de vecchio56
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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 ???
Commenter la réponse de ncoder
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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
Commenter la réponse de vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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;

}
Commenter la réponse de vecchio56
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
exemple complet ici:
http://www.cppfrance.com/code.aspx?id=17387

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
Ok je vais voir Brunew merci
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
Dev me fais plein d'erreur...

Comment réussir à partir de mon code ?
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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 ?
Commenter la réponse de ncoder
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
hhk = SetWindowsHookEx(...)

hhk est bien != NULL ???

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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;
}
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
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...!!! )
Commenter la réponse de ncoder
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
Je viens de me rendre compte que hhk ne "disparait" jamais meme si je fais UnHookWindowsHookEx(hhk) ...?
Commenter la réponse de ncoder