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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 463
    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 463
    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 ?

+ 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