EnumWindows et FindWindow

Signaler
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006
-
Messages postés
458
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
-
salut !!
malgré mes recherches ,j'ai pas pu bien comprendre le fonctionnement des fonctions enumwindows et findwindow .ça sera simpa si on m'aide a repondre a ces questions :
1- d'apres les sources que j'ai trouvé ,je crois que enumwindows associr le procedure passe en 1 parametre au thread passé en 2 parametre .mais comment obtenur le handle d'un controles trouver dans la fenetre principale sans connaitre son id ??
2-comment faire fonctionner FindWindow?
3- le procedure passe en paratre doit il avoir lui aussi 2 parametre ?
4- comment sont ils identifie ?
5- comment faire parcourir les controles de meme type un par un ?
merçi d'avance

5 réponses

Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

voila j'ai essayé de parcourir les controles d'un programme mais ça n'a pas marché :

#include <windows.h>
HWND Hwnd ;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
Hwnd = GetNextWindow(hwnd,GW_HWNDNEXT) ;
for(int a =0 ; a < 5 ; a++)
{
SendMessage(Hwnd,MOUSEEVENTF_LEFTDOWN,0,0) ;
}
MessageBox(hwnd,"press\n","probleme",MB_OK) ;

return 1; // POUR CONTINUER
}



int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
char szbuff[260];
DWORD pid ;

strcpy(szbuff,"a.exe") ;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWMAXIMIZED;
CreateProcess(szbuff, 0, 0, 0, 0, 0, 0, 0, &si, &pi);
pid = pi.dwThreadId; // IMPORTANT !!!
EnumWindows(EnumWindowsProc, (LPARAM) pid);
return 1 ;
}
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

j'ai pu obtenir un handle sur la fenetre ,il ne me reste que savoir comment je peux obtenir un handle la 1 fenetre child situé dans cette fenetre .merçi d'avance
Messages postés
458
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
/**
* \fn BOOL CALLBACK CloseAllEnum(HWND hwnd, LPARAM lparam)
* Fonction callback d'une fonction énumérant des fenetres.
* Fermeture d'une fenetre enfant
* \brief Fermeture d'une fenetre enfant
* \param hwnd Handle de la fenetre donné par la fonction EnumChildWindows
* \param lparam 0: Inutilisé; !0:Adresse d'une chaine de caractère décrivant le classname des fenetres à fermer
*/
int CALLBACK CloseAllEnum(HWND hwnd, LPARAM lparam)
{
if (lparam == 0)
{
if (!GetWindow(hwnd, GW_OWNER))
DestroyWindow(hwnd);
}
else
{
char buffer[256];

GetClassName(hwnd, buffer, 255);
if (stricmp((LPSTR) lparam, buffer) == 0)
if (!GetWindow(hwnd, GW_OWNER))
DestroyWindow(hwnd);
}
return 1;
}

/**
* \fn void closeAllChild(HWND parent)
* Fermeture de toutes les fenetres enfants
* \brief Fermeture des enfants
* \param parent Handle de la fentre parent
*/
void closeAllChild(HWND parent)
{
EnumChildWindows(parent, CloseAllEnum, 0L);
}

/**
* \fn void closeAllChildClass(HWND parent, char *classname)
* Fermeture de toutes les fenetres enfants d'un type particulier
* \brief Fermeture des enfants
* \param parent Handle de la fentre parent
* \param *classname Classname des fenetres à fermer
*/
void closeAllChildClass(HWND parent, char *classname)
{
EnumChildWindows(parent, CloseAllEnum, (LPARAM) (LPSTR) classname);
}

En gros, ces fonctions ferment tous les controles enfants d'une fenetre en les parcouarnt un par un. En changeant la fonction CloseAllEnum, tu peux faire faire ce que tu veux à chacun des composants de la fenetre parent. Si tu cherches a travailler sur un type de comoosant particulier, utilise le classname de ce composant.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

merçi pour l'explication ,cepandant j'ai pas compris l'interret de cette ligne :
if (!GetWindow(hwnd, GW_OWNER))

merçi d'avance
Messages postés
458
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Je crois bien qu'elle ne me sert a rien du tout. (Je vois plus pourquoi elle est la), j'ai meme l'impression que c'est une erreur.
Mais l'intéret pour toi n'est pas la.
C'est cette fonction (CloseAllEnum) qu'il faut que tu refasses pour faire ce que tu veux avec tous les controles de ta fenetre..

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]