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?
Version imprimable
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:
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 genreCode:
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.Citation:
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.