Récupèrer le chemin absolu de l'exe de la fenêtre au premier plan. [Résolu]

cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention - 8 avril 2007 à 01:08 - Dernière réponse : cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention
- 9 avril 2007 à 12:02
Bonjour,

Dans le cadre d'un petit projet sous Vista, je doit récupèrer le chemin (absolu) qui mène à l'executable associé à la fenêtre au premier plan.

J'utilise Visual C++ 2005 express, et j'ai installé la version 2003 server R2 de PSDK (puis configuré VC++ pour qu'il la trouve)

D'après mes recherches sur msdn et les questions déja posées sur le forum, il faudrais utiliser :
- GetForegroundWindow(...) ou GetFocus() pour récupèrer le handle sur la fenêtre
- GetWindowThreadProcessId(...) pour récupèrer l'id du processus associé
- GetFullProcessImageName(...) pour récupèrer le chemin à partir du handle (n'existe que depuis Vista, selon msdn)

Le problème, est que VC++ ne connais pas "GetFullProcessImageName"
error C3861: 'QueryFullProcessImageName': identifier not found
(cependant les autres ne posent pas problème)

Est-ce lié à ma version de PDSK ?

Merci.
Afficher la suite 

11 réponses

Répondre au sujet
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 8 avril 2007 à 10:00
+3
Utile
Salut,
Je pense qu'il faudra plutôt utiliser GetModuleFileNameEx() car GetModuleFileName() ne fonctionne que pour le processus courant. Voici un exemple de code:

#include <windows.h>

#include

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


int WINAPI WinMain(HINSTANCE hinst, HINSTANCE prev, LPSTR cmd, int show)

{

    char buffer[MAX_PATH];

    DWORD pid=0;

    HWND hwnd=GetForegroundWindow();

    GetWindowThreadProcessId(hwnd,&pid);

    HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ ,0,pid);

    GetModuleFileNameEx(hProcess,0,buffer,MAX_PATH);

    CloseHandle(hProcess);

    MessageBox(0,buffer,"Chemin complet",0);

    return 0;

}



Je viens de voir que QueryFullProcessImageName() est une nouveauté Vista. D'après MSDN, elle est déclarée dans winbase.h. Si elle y figure, il suffira de commencer le code par:
#define _WIN32_WINNT 0x0600
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 8 avril 2007 à 01:26
0
Utile
GetForegroundWindow te donne le handle de la fenetre au premier plan.
GetModuleFilename te donne le chemin correspondant au handle d'une application.

Shell
Commenter la réponse de DeAtHCrAsH
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 8 avril 2007 à 09:47
0
Utile
On reprend le tout dans l'ordre:
GetForegroundWindow
GetWindowThreadProcessId
OpenProcess
GetModuleFileName
CloseHandle (pour le hprocess de OpenProcess)

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 8 avril 2007 à 10:08
0
Utile
Excellente rectification.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention - 8 avril 2007 à 10:25
0
Utile
Merci beaucoup !
Ca faisait une semaine que je me demandais comment faire utiliser cette satanée fonction incluse dans <winbase.h>...

Le moins qu'on puisse dire c'est que vous m'avez bien aidé ^^
Commenter la réponse de cs_palmipede
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 8 avril 2007 à 11:57
0
Utile
Un programme qui ne marche que sous Vista, c'est peut être pas une bonne idée, autant utiliser la méthode de racpp plutot que QueryFullProcessImageName

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention - 9 avril 2007 à 00:26
0
Utile
Mon programme est destiné à tourner en parallèle avec un gadget dans la sideBar de Vista ^^ (de toute façon j'ai fini par décider d'utiliser GetModuleFileNameEx)

Par contre, il y a une chose que je ne comprend pas, avec certaines applications au premier plan, je récupère effectivement le handle sur la fenêtre, mais je ne peut pas ouvrir le process...
Commenter la réponse de cs_palmipede
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 9 avril 2007 à 00:40
0
Utile
Par exemple ?

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention - 9 avril 2007 à 10:56
0
Utile
Pour l'instant ça ne me le fais que sous Warcraft3, j'arrive à récupèrer le pid du processus, mais OpenProcess retourne NULL...
Commenter la réponse de cs_palmipede
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 9 avril 2007 à 11:15
0
Utile
Je ne peux pas tester car je n'ai pas de jeu hors le pinball que j'ai ramené de XP et ça va impec avec celui ci.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_palmipede 8 Messages postés dimanche 25 mars 2007Date d'inscription 19 octobre 2010 Dernière intervention - 9 avril 2007 à 12:02
0
Utile
A priori ça doit être un problème de droits, vu que même taskManager n'arrive pas à accèder au nom de l'exe, sauf si je demande "Perform Administrative Tasks" par clique droit sur le processus (cette action demande bien sur les pouvoirs d'administrateur)

Je me demande aussi si le fait que cette application ne soit pas installée mais seulement une copie de l'install de quelqu'un d'autre ne joue pas mes droits 
Commenter la réponse de cs_palmipede

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.