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 :

Comment récupérer un Handle à partir du PID ?


Sujet :

MFC

  1. #1
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut Comment récupérer un Handle à partir du PID ?
    Voilà...j'ai le PID (l'ID du processus Windows) d'une appli et à partir de celui-ci je souhaite récupérer son HANDLE afin de lui envoyer un message via PostMessage.

    Une idée pour avoir cet HANDLE?
    -----
    Liv

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    il me parait plus approprié de retrouver la fenetre avec FindWindow puisque j'imagine que tu as déjà quelque chose d'affiché.

    De plus, il faut utiliser SendMessage et non PostMessage avec WM_COPYDATA

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Tu peux obtenir un HANDLE mais sur le processus. Toi tu veux un handle HWND sur la fenêtre principale du processus.
    Soit tu connais le titre / classe de la fenêtre et tu peux tenter FindWindow comme te l'a dit nico, soit tu peux énumérer les fenêtre du thread principal du processus pour trouver la fenêtre principale (EnumThreadWindows).
    Tu l'obtient comment ce PID ?

  4. #4
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    J'obtiens mon PID de façon un peu particulière en fait mais je me rend compte d'un truc qui complique tout.

    En somme le PID dont je vous parlais est celui de l'instance de mon programme. Cette instance est caractérisée au niveau de l'affichage par 2 Dlg. (C'est un player vidéo en fait, avec un écran et une zone magnétoscope).

    Nico connait va reconnaître un peu ce que je vais dire...

    Procédons par étape:
    1. Mon appli (player) est ouverte.
    2. Je double-clique sur un média
    3. Ouverture d'une nouvelle instance de mon player avec transmission en ligne de commande du chemin complet du fichier double-cliqué.
    4. Je repère qu'une instance tourne déjà...je récupère son PID (de façon certaine).
    5. J'envoie le chemin complet du fichier récupéré en ligne de commande, à mon instance déjà ouverte (c'est sur ce point que ma question se pose en fait):
    -> via SendMessage (merci à nico) je dois récupérer le handle correspondant à la fenêtre magnétoscope (Handle inconnu ???) de ma première instance (PID déjà récupéré).


    Il me semble que la fonction FindWindow récupère des Handle via le nom de la barre de titre de cette dlg...mais ce n'est pas bon car elle change souvent.

    Est-ce que les choses semblent plus claires ? J'espère ne pas vous avoir embrouillé.
    Ma question est donc...Comment je fais pour récupérer le Handle de ma fenêtre magnétoscope afin de lui transmettre mon fichier à charger ?
    Est-ce qu'il est possible via le PID d'une application de savoir combien de dlg sont ouvertes et d'en récupérer les infos ?


    Pour répondre à ta question Aurélien...voilà comment je récupère le PID de l'instance tournant déjà.

    Le but est de trouver via le nom de l'appli en cours (toto.exe) et son PID, le PID de la même appli tournant déjà.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    //Cherche un processus chargé sous Windows et renvoi son PID
    //AppName est le nom de mon Appli
    //DvdAt_PID est le processus de mon appli en cours
     
    DWORD CTools::FindApp(LPCTSTR AppName, DWORD DvdAt_PID)
    {
    	// création du snapshot
    	HANDLE sys = NULL;
     
    	if (!(sys = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)))
    		return 0;
     
        //Ouverture du premier process
        PROCESSENTRY32 proc;
        ZeroMemory(&proc, sizeof(proc));
        proc.dwSize = sizeof(proc);
     
    	if (!Process32First(sys, &proc))
    		return 0;
     
    	//On cherche le process Dvd@
        DWORD PID		= 0;
    	DWORD PID_TEMP	= 0;
    	int i			= 0;
     
    	do
    	{
    		//On l'a trouvé
    		if(lstrcmp(proc.szExeFile, AppName) == 0)
    		{
    			PID_TEMP = proc.th32ProcessID;
     
    			//Si le PID trouvé est différent de l'instance en cours
    			if(DvdAt_PID != PID_TEMP)
    			{
    				PID = PID_TEMP;
    				i++;
    			}
     
    			//Si 2 autres instances sont déjà ouvertes on ferme l'application
    			//en retournant le PID de l'instance en cours
    			if(i >1)
    			{
    				CloseHandle(sys);
    				return DvdAt_PID;
    			}
    		}
        }while (Process32Next(sys, &proc));
     
    	CloseHandle(sys);
    	return PID;
    }
    -----
    Liv

  5. #5
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    Mais sinon...tu disais qu'avec EnumThreadWindows je peux récupérer le Handle de ma fenêtre principale du processus PID ? C'est bien ça?
    -----
    Liv

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Ah ben si c'est ta propre fenêtre c'est plus simple.
    FindWindow utilise le titre de la barre des titres, mais pas seulement, ca utilise aussi la classe de fenêtre, et ça tu peux choisir un nom à toi.
    Y'a d'autres possibilités, comme stocker ton handle dans une section partagee de ton exe. Ce probleme est traite sur codeproject.

  7. #7
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    Merci pour ces infos.
    Par contre je ne connais pas trop le site codeproject...aurais tu le lien direct car ton idée de stoker le handle dans une section partagée de l'exe est excellente.
    -----
    Liv

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    comme dans cet exemple de la FAQ, http://c.developpez.com/faq/vc/?page...NoMoreInstance

    il te suffit de faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #pragma data_seg("TestApp") 
     
    // la variable commune a tous les process
    HWND monHandle = 0; 
    #pragma data_seg()

  9. #9
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    Bah là vous m'apprenez quelque chose....je ne savais pas tout cela.
    Et de l'autre côté comment fait-on pour accéder à cette variable ?
    -----
    Liv

  10. #10
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    Bon...je suis sur les HOWTO de Krosoft...y'a pleins de trucs intéressants.
    -----
    Liv

  11. #11
    liv
    liv est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    Points : 41
    Points
    41
    Par défaut
    J'ai une question !

    Comment on fait pour déterminer un nom de classe à une dlg ?
    J'ai vu que sous visual on pouvait le faire à la mano dans les pages de propriété de ma dlg mais hélas la propriété "Class Name" est évidemment grisée. M'aurait étonné.
    -----
    Liv

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par liv
    Et de l'autre côté comment fait-on pour accéder à cette variable ?
    Tu l'utilise comme une variable normale. Au détail près qu'il faut avoir à l'esprit qu'elle peut être modifiée par une autre instance de ton programme.
    Note que y'a une limitation, quand même par rapport au mutex / FindWindow : si l'utilisateur crée une copie de ton programme et lance l'original puis la copie, les 2 tourneront ensemble car on a 2 exe différents. Seul le même exe partage la même section.
    Pour choisir son propre nom de classe, en MFC je sais pas. Mais tu n'est pas obligé d'utiliser une vraie fenêtre. Ca peut même être mieux d'utiliser une fenêtre invisible qui ne sert qu'à la communication.

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

Discussions similaires

  1. Comment récupérer les handles des fenêtres d'un processus ?
    Par pivil dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 19/09/2007, 19h03
  2. Réponses: 3
    Dernier message: 26/07/2007, 18h28
  3. Réponses: 5
    Dernier message: 09/02/2007, 18h46
  4. [VB 2005] Comment récupérer le Handle d'un DataGridViewButton
    Par D4rkTiger dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/08/2006, 18h53
  5. Récupérer le handle à partir d'un processus
    Par sat83 dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2005, 17h21

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