Obtenir un HWND

Signaler
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
j'aurai besoin de récupérer un hwnd
j'ai coder ca

HANDLE hSnapShot;
PROCESSENTRY32 uProcess;
bool r;
short PID = 0; //variable qui va stocker l'ID du processus de l'application que l'on désire fermer.

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);

r = Process32First(hSnapShot, &uProcess);
do // Cette boucle énnumère tout les processus
{
if ( strstr(uProcess.szExeFile, ExeName) )//on cherche le nom de notre application dans le chemin d'accès de l'éxécutable du processus.
PID = (short) uProcess.th32ProcessID;
//MessageBox(0,uProcess.szExeFile,0,0);
r = Process32Next(hSnapShot, &uProcess);
} while ( r );

return hSnapShot;
ce code récupere tous les process qui sont entrain de tourner, ne faite pas attention au return hSnapShot, a la base c t return PID.

Bon voila il me fodrai un HWND par rapport au ExeName, alors a mon avis par le HANDLE, peut etre ou par le pid de la fonction

merci de votre solution

8 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Tu peux obtenir un hwnd simplement par son titre, ou encore sa classe, si cette maniere t'interesse, http://www.cppfrance.com/code.aspx?ID=18911

Voila ++

ALhexman
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
merci je vais regarder le code
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Pas besoin d'une source pour ca, une seule fonction: FindWindow
Par contre tu trouvera pas un HWND à partir du nom de l'exe car le nombre de HWND peut être 0, 1, 2... pour un programme donné
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Pourquoi ne ferais tu pas le contraire: a partir d'un HWND tu peux trouver le PID, donc en enumerant les fenetres tu peux te faire la liste des HWND de chaque processus.
Messages postés
71
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
12 août 2004

j'ai pas bien compris ce code est ce que tu essaye de tuer un processus connu par son pid.
car j'en ai besoin pour une application.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
exactement c t un code ki avait pour but de tuer un processus

c un code ke j'avais codé il y a un bout largement inspirer de msdn....

je te donne tout le code pour ke tu puisse tuer le proccessus en fonction de son titre... destiné a imanewin32

short CALLBACK CClose(char* ExeName)
{
HANDLE hSnapShot;
PROCESSENTRY32 uProcess;
bool r;
short PID = 0; //variable qui va stocker l'ID du processus de l'application que l'on désire fermer.

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);

r = Process32First(hSnapShot, &uProcess);
do // Cette boucle énnumère tout les processus
{
if ( strstr(uProcess.szExeFile, ExeName) )//on cherche le nom de notre application dans le chemin d'accès de l'éxécutable du processus.
PID = (short) uProcess.th32ProcessID;

r = Process32Next(hSnapShot, &uProcess);
} while ( r );

CloseHandle(hSnapShot);
return PID;

}

/////////////////

DWORD WINAPI /*CBPManagerserverDlg::*/ CALLBACK TerminateApp( DWORD dwPID, DWORD dwTimeout )
{
HANDLE hProc ;
DWORD dwRet ;

// If we can't open the process with PROCESS_TERMINATE rights,
// then we give up immediately.
hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,
dwPID);

if(hProc == NULL)
{
return TA_FAILED ;
}

// TerminateAppEnum() posts WM_CLOSE to all windows whose PID
// matches your process's.
EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ;

// Wait on the handle. If it signals, great. If it times out,
// then you kill it.
if(WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
dwRet=(TerminateProcess(hProc,0)?TA_SUCCESS_KILL:TA_FAILED);
else
dwRet = TA_SUCCESS_CLEAN ;

CloseHandle(hProc) ;

return dwRet ;
}
//////////////////////////
BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam )
{
DWORD dwID ;

GetWindowThreadProcessId(hwnd, &dwID) ;

if(dwID == (DWORD)lParam)
{
PostMessage(hwnd, WM_CLOSE, 0, 0) ;
}

return TRUE ;
}

tu auras juste a faire ca

short PID=CClose("NOM de TON APPLICATION, genre Outlook,...., c'est le titre de l'application");
TerminateApp(PID,5000);
running= false;
WaitForSingleObject(hThread,1000);
CloseHandle(hThread);

cette manière et fortement conseiller par microsoft pour terminer une application apres c a chacun de voir...

pour revenir a AlexMAN m'a proposé comme source je l'a trouve tres interessante et je vais faire un peux de ta sauce plus ce ke je connais si cela t'interesse...
a aussi un truc je sais po pourkoi fodrai ke je regarde de facon plus appronfondi, mais pendant ton SetWindowText, il y a une couille, a la fin il me met un caractere bizard...., et chez moi pour ke le prog ne merde po j'ai du initialiser tout tes char a NULL
c'est-à-dire par ex char cChoice="";, et ainsi de suite, car ca compil mais lors de l'execution il me di ke la variable n'a po ete initialisé donc... (c'est des détails, ne t'en fais po c po une critike)

voila c tout merci a tous
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
C'est vrai pour l'histoire du SetWindowText, mais ca ma pas semblé tres important donc j'ai pas cherché a comprendre...

++
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
si je trouve je t'informe