Recuper le chemin d'un executable a partir du titre, ou HWND ou Class

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 15 juil. 2004 à 12:55
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 15 juil. 2004 à 22:46
Bon voila j'ai le titre du programme, j'ai également sa class, et son HWND...

maintenant j'aimerai recup le chemin.... genre c:\windows\prog.exe

je suis entrain de voir avec MODULEENTRY32 & CreateToolhelp32Snapshot & PROCESSENTRY32...

pour le moment pas de succes kelk'1 pourrait m'aider!!!!
A voir également:

25 réponses

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
15 juil. 2004 à 14:07
si tu as le HWND, il te suffit d'utiliser GetModuleFileName
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 15:20
ok je vais chercher dans ce sens mais j'ai trouver un truc

peut etre un peut compliquer mais je suis encore dessus

void ReturnCheminDuProcess()
{
HANDLE hSnapShot,hModuleSnap ;
PROCESSENTRY32 uProcess;
MODULEENTRY32 uModule;
bool r,r2;
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;*/
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, uProcess.th32ProcessID);
r2=Module32First(hModuleSnap,&uModule);
/*do
{

Module32Next(hModuleSnap, &uModule);
}while(r2);*/
printf( "Module Name\t\t%s\n", uModule.szModule);
printf( "Full Path\t\t%s\n\n", uModule.szExePath);
r = Process32Next(hSnapShot, &uProcess);
} while ( r );
CloseHandle(hModuleSnap);
CloseHandle(hSnapShot);


}

en revanche ce bout de code donne tous les chemins des processus, (Rmq: ici je suis en console)

fo ke je trouve un moyen de faire correspondre soit le PID, ou autre chose pour avoir le FUllpath

merci, je cherche tjrs
youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 15:28
pour ton GetModuleFileName

le probleme c ke c un HWND et non un HMODULE
j'ai testé ca

char sfgdk[500];
GetModuleFileName((HMODULE)HwndDest,sfgdk,500);
MessageBox(0,sfgdk,0,0);

avec un cast ca merde

a moins ke tu es la solution je ne vois po comment
youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 15:34
bon j'ai essayer ca:

TCHAR sfgdk[500];
GetModuleFileName((HMODULE)GetClassLong(HwndDest, GCL_HMODULE),sfgdk,500);
MessageBox(0,sfgdk,0,0);

ca marche mais ca me donne a tous le coup c:\windows\user32.dll et non le chemin du prog

HELP!!!
youpi :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 15:42
GetWindowLong(hwnd, GWL_HINSTANCE);
a passer a GetModuleFileName.

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 17:50
j'y avais pensais mais regarde ce ke j'ai fais:

while (iResult)
{

if(GetAsyncKeyState(VK_LBUTTON) && GetAsyncKeyState(VK_LBUTTON))
{
GetCursorPos(&pCursor);
iResult = 0;
//MessageBox(0,"rentre",0,0);

}
hWindow = WindowFromPoint(pCursor);
GetWindowText(hWindow, sTitle, 400);
GetClassName(hWindow, sClass, 400);

}
HwndDest=FindWindow(sClass,sTitle);
if (HwndDest!=0) ShowWindow(HwndDest,SW_HIDE);
else MessageBox(0,"NULL",0,0);
TCHAR sfgdk[500];
//if (HwndDest!=0) GetWindowModuleFileName((HWND)GetWindowLong(HwndDest,GWL_HWNDPARENT),sfgdk,500);
GetModuleFileName((HMODULE)GetWindowLong(HwndDest, GWL_HINSTANCE),sfgdk,500);

MessageBox(0,sfgdk,0,0);

il me retourne le chemin du programme qui lance cette fonction et pas le chemin de celui seectioné avec le pointeur

vous alez me dire ke c ton HWND (HwndDest), qui est po mais si, si je fais un ShowWindow(HwndDest,SW_HIDE); ca marche, mais j'arrive pas a avoir son path...

Ouin.....

merci de votre aide
youpi :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 17:58
Tu aurais donc le bon hwnd et te sort un mauvais exeName.
Attends je vais tester cela et je te dis. Je vais proceder ave Un FindWindow sur la calculatrice par exemple, on verra.

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 17:59
ok merci
youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 18:20
j'ai mis la source

http://www.cppfrance.com/code.aspx?ID=24582
youpi :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 20:14
Bon de retour, voila une demo.
Je cherche la fenetre Calculatrice et si trouvee j'affiche son fullExeName. Tu adapteras pour ton prog.
Attention NT ou sup, les winbebes pas pris en compte (y en a plus et faut les ignorer pour qu'ils disparaissent plus vite).

#define _WIN32_WINT 0x500

#include <windows.h>
#include

#pragma comment(lib, "Psapi.lib")

char szbuff[264];
char szappname[] = "Chemin";

char szcalc[] = "Calculatrice";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
HWND hcalc;
HANDLE hprcss;
DWORD prcid;
hcalc = FindWindow(0, szcalc);
if(hcalc) {
GetWindowThreadProcessId(hcalc,&prcid);
hprcss = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, prcid);
if(hprcss) {
if(GetModuleFileNameEx(hprcss, 0, szbuff, 260))
MessageBox(0, szbuff, szcalc, 0);
CloseHandle(hprcss);
}
}
return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 20:33
super merci ca m'arange beucoup car j'etais encore dessus sans resultat...

j'arrive a sa avec la sauce un peu des deux

HwndDest=FindWindow(sClass,sTitle);
DWORD prcid;
if (HwndDest!=0)
{
GetWindowThreadProcessId(HwndDest,&prcid);
/*_itoa(prcid,ghjhgj,10);
MessageBox(0,ghjhgj,0,0);*/
HANDLE hprcss = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, prcid);
if(hprcss) {
char szbuff[260];
if(GetModuleFileNameEx(hprcss, 0, szbuff, 260))
//MessageBox(0, szbuff, 0, 0);
CloseHandle(hprcss);
}

}

j'aimerai maintenant faire un

AnimateWindow(HwndDest,200,AW_HIDE | (AW_SLIDE | AW_HOR_NEGATIVE));

a la place du ShowWindow(HwndDest,SW_HIDE);
le probleme dans mon cas c ke ca marche po ca le hide mais ca ne rafraichi po au niveau du desktop, en gros l'animation ce fais pas

je pense ke cela viens car le HWND n'est po au "hwnd is a top-level window"

comment faire??
enumerer les processus???
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 20:41
ohe youpiyoyo, un petit service.
Reçois tu alerte mail pour ce poste ?
Moi plus rien.

Que galere la mise au point de la nouvelle version.

ciao...
BruNews, Admin CS, MVP Visual C++
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
15 juil. 2004 à 20:43
moi je recois
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 20:44
au fait je vois un truc dans ton code, fais gaffe a bien fermer le hprocess inconditionnellement s'il a bien ete ouvert. Pas le cas actuellement.

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 20:44
moi je recois
aussi
youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 20:47
ca deja été supprimer car j'en ai plus besoin maintenant car ton bout de code fonctionne a merveille, en revanche
l'histoire du animatewindows c bizzard:

si je fais ShowWindow(HwndDest,SW_HIDE); ca marche mais si je fais
AnimateWindow(HwndDest,200,AW_HIDE | (AW_SLIDE | AW_HOR_NEGATIVE)); ca marche pas

etrange...

je vais poster la version de ce soir
youpi :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 20:49
Merci les gars, c'est debloque ici aussi, arrivee en vrac, avaient du faire un tour dans un embouteillage.

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 21:33
alors autre question....

si je click sur une list view ou autre chose j'aimerai recuperer la fentre alors j'ai testé ça

while (iResult)
{

if(GetAsyncKeyState(VK_LBUTTON) && GetAsyncKeyState(VK_LBUTTON))
{
GetCursorPos(&pCursor);
iResult = 0;
hWindow = WindowFromPoint(pCursor);

}

}

HwndDest=FindWindow(sClass,sTitle);
HWND HwndTmp=0;
if (IsWindow(HwndDest)==0)
{
HwndTmp=GetTopWindow(HwndDest);
if (IsWindow(HwndTmp)!=0) HwndDest=HwndTmp;

}

avec le GetTopWindow, j'ai verif si c'etait bien une windows avec IsWindow, il me di ke oui mais il me fais pas de HIDE...

la je comprend pas, et encore personne ne m'a repondu!!! si il fo ke j'enumere les processus ou autre chose pour avoir le HWND du programme

please help!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 juil. 2004 à 21:58
On ne peut pas dire qu'il y a un 'HWHD' du prog, pas obligatoire qu'il y en ait un et peut y en avoir plusieurs.
Teste si est WS_CHILD, si oui alors GetParent.

ciao...
BruNews, Admin CS, MVP Visual C++
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
15 juil. 2004 à 22:00
je test WS_CHILD avec Ischild???
youpi :)
0
Rejoignez-nous