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 confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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?

  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
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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;
    }

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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?

  6. #6
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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.

  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
    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 confirm�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    124
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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 ?

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

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 124
    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�.

  12. #12
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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. 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