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 503
    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 503
    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 503
    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 503
    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