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?
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?
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
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 ?
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; }
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?
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.
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.
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()
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 ?
Bon...je suis sur les HOWTO de Krosoft...y'a pleins de trucs int�ressants.
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�.
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.Envoy� par liv
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.
Partager