IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Retrouver le nom d'un exécutable avec un Handle


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut Retrouver le nom d'un exécutable avec un Handle
    Bonjour,
    Je suis en train de créer une application tournant en arrière plan pouvant agir sur les applications actives en simulant l'appui de touche.
    Mon problème est que suivant l'application active, je ne souhaite pas générer la même séquence.

    En conséquence, il me faut savoir le nom de l'application active.

    J'ai déjà réussi à trouver son Handle par la fonction : GetForegroundWindow().

    Cependant, je ne trouve pas une fonction qui me permet de relier le Handle à un exécutable.
    La seule s'en rapprochant est GetModuleFileName mais qui ne fonctionne que si l'exécutable est lancé par le process courant.

    Avez-vous une solution.
    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 471
    Par défaut
    GetForegroundWindow retourne un handle de fenêtre, pas un handle de process.

    "GetWindowThreadProcessId" pour récupérer le ProcessId du processus "propriétaire" de la fenêtre.
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    "OpenProcess" pour avoir un handle sur le processus.
    http://msdn.microsoft.com/en-us/library/ms684320.aspx

    "QueryFullProcessImageName" pour avoir le chemin vers le fichier image du processus.
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    Merci, je teste ça de suite

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    J'ai essayé ces fonctions sans succès. Voici mon code exécuté par un Timer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	CString str_a;
    	CString str_b;
    	HWND hwnd_a=::GetForegroundWindow();
    	HANDLE c=NULL;
    	DWORD prhnd;
    	//prhnd = new DWORD;
    	prhnd=GetWindowThreadProcessId(hwnd_a,NULL);
    	str_a.Format(_T("%p"),prhnd);
    	edt_HDL.SetWindowText(str_a);
    	c=OpenProcess(STANDARD_RIGHTS_ALL,TRUE,prhnd);
    	if(c==NULL)
    	{
    		DWORD erreur=GetLastError();
    		str_b.Format(_T("%d"),erreur);
    		AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    	}
    	else
    	{
    		str_b.Format(_T("%p"),c);
    		edt_Nom.SetWindowTextW(str_b);
    	}
    	CFormView::OnTimer(nIDEvent);
    hwnd_a récupère bien un handle sur la fenètre active.
    prhnd récupère bien un handle sur le thread (process?)

    c doit être un handle sur le process pour me permettre de lire le chamin de l'application.
    Cependant, j'obtient toujours un pointeur c = NULL.
    Après lecture du message d'erreur, j'obtient l'erreur 87 qui veut dire :
    The parameter is incorrect.
    Une autre idée

  5. #5
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Met des GetLastError() plus tôt à plusieurs endroits, pour voir où est l'horreur originale. C'est pas inhabituel que la première erreur soit beaucoup plus haut, et que donc la suite modifie l'erreur, mais sans que ça plante (et sans résultat).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    J'ai modifié le code avec plus de GetLastError
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void CGethdlView::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels
    	CString str_a;
    	CString str_b;
    	LPWSTR str_c = new _TCHAR[100];
    	HWND hwnd_a=::GetForegroundWindow();
    	DWORD erreur=GetLastError();
    	str_b.Format(_T("GetForegroundWindow : %d"),erreur);
    	AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    	HANDLE c=NULL;
    	DWORD* prhnd= new DWORD;
    	PDWORD lng =new DWORD;
    	GetWindowThreadProcessId(hwnd_a,prhnd);
    	erreur=GetLastError();
    	str_b.Format(_T("GetForegroundWindow : %d"),erreur);
    	AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    	str_a.Format(_T("%p"),prhnd);
    	edt_HDL.SetWindowText(str_a);
    	c=OpenProcess(PROCESS_QUERY_INFORMATION,TRUE,*prhnd);
    	erreur=GetLastError();
    	str_b.Format(_T("Open process : %d"),erreur);
    	AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    	if(c==NULL)
    	{
    		erreur=GetLastError();
    		str_b.Format(_T("Open process : %d"),erreur);
    		AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    	}
    	else
    	{
    		if(QueryFullProcessImageName(c,PROCESS_NAME_NATIVE,str_c,lng))
    		//str_b.Format(_T("%p"),c);
    			edt_Nom.SetWindowTextW(str_c);
    		else
    		{
    			erreur=GetLastError();
    			str_b.Format(_T("QuerryFullProcessImageName : %d"),erreur);
    			AfxMessageBox(str_b,MB_OK|MB_APPLMODAL,1);
    		}
    	}
    	CFormView::OnTimer(nIDEvent);
    }
    Maintenant, j'arrive jusqu'à QueryFullProcessImageName avant une erreur et les autres fonctions ne me retournent aucune erreur (0).

    Par contre, l'ID de l'application active change tous le temps même quand je laisse la même fenêtre en surbrillance entre 2 exécution. Est-ce normal?

  7. #7
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Et donc QueryFullProcessImageName renvoie quelle erreur exactement ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    Erreur N°87 :
    The parameter is incorrect.
    Cependant, je ne vois pas quel paramètre est incorrect

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 471
    Par défaut
    Pensez à lire attentivement la documentation et à la comprendre.

    Primo, moi je pense que le second paramètre serait, dans votre cas, 0 et non "PROCESS_NAME_NATIVE".

    Secondo, il est dit dans la documentation que le paramètre lpdwSize est "__inout", c'est à dire qu'il sert à la fois en sortie ET en entrée.
    lpdwSize [in, out]
    On input, specifies the size of the lpExeName buffer, in characters. On success, receives the number of characters written to the buffer, not including the null-terminating character.
    Dans votre code, la variable "lng" devrait être initialisée à 100 (à cause de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPWSTR str_c = new _TCHAR[100];
    ), avant l'appel à QueryFullProcessImageName.

    P.S.: faite gaffe à vos conventions de nommage, car "str_a" et "str_c" n'ont pas du tout les mêmes types.
    La notation hongroise avec les types en préfixe, c'est pas top. Préférez une notation sans ce préfixe.
    On n'a maintenant IntelliSense et on est en C++, pas en C.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Par défaut
    Ok, merci beaucoup.
    Je débute en MFC et en programmation windows.
    J'ai encore du mal avec le language de msds.

    Merci beaucoup à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retrouver un nom avec le dos..
    Par sabredebois dans le forum Windows 7
    Réponses: 48
    Dernier message: 13/05/2012, 13h23
  2. [Access] Nom d'une table avec un espace dans SQL
    Par Corsaire dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 15h50
  3. [VB.NET] Comment récupérer le nom d'un control avec le focus
    Par jayce007 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/01/2005, 00h53
  4. Retrouver le nom d'un utilisateur qui a verrouillé une ligne
    Par Laurent Dardenne dans le forum Administration
    Réponses: 24
    Dernier message: 18/09/2004, 17h01
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo