Handle de fenêtre et process ID...

Résolu
cyrilpradel Messages postés 12 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 12 décembre 2005 - 12 déc. 2005 à 09:47
cyrilpradel Messages postés 12 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 12 décembre 2005 - 12 déc. 2005 à 14:48
Salut tout le monde !

Via
la fonction Shell, je lance une application (la fonction Shell me
retourne le process Id de l'appli lancée mais pas le handle)
Avant, je m'appuyais sur la classe de fenêtre pour la retrouver :

'on lance l'appli
hApp = Shell(<monExe> + " " + , <mode d'ouverture>)
hFen = 0
'Recherche du handle de la fenêtre (hFen) selon sa classe (zClassFen) jusqu'à la fin du timer ou jusqu'à ce qu'on trouve
Do While hFen = 0 And (Timer < lTimer)
DoEvents
hFen = GetWinHandle(zClassFen)
Loop

PS : Je ne détaille pas la fonction GetWinHandle mais j'utilisais les API GetWindow et GetClasseName

Cela fonctionnait très bien à partir du moment où on connaissait la classe de fenêtre.
Aujourd'hui, je cherche à récupérer le handle d'une appli selon son process Id.
On aurait donc :

'on lance l'appli
hApp = Shell(<monExe> + " " + , <mode d'ouverture>)
hFen = 0
'Recherche du handle de la fenêtre (hFen) selon sa classe (zClassFen) jusqu'à la fin du timer ou jusqu'à ce qu'on trouve
Do While hFen = 0 And (Timer < lTimer)
DoEvents
hFen = GetWinHandlePid(hApp)
Loop

Et c'est là que je sèche !
Si vous avez des idées, n'hésitez pas à me contacter.

Merci d'avance !

Cyril
A voir également:

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 déc. 2005 à 11:56
EnumWindows
et regarde pendant énumération (dans l'enumProc) la 1ere qui correspond au processId.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 déc. 2005 à 11:16
OpenProcess()

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cyrilpradel Messages postés 12 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 11:38
Merci !
Après avoir déclaré l'API OpenProcess, voilà donc ce que j'ai fais :

'on lance l'appli
hApp = Shell(<monExe> + " " + , <mode d'ouverture>)
hFen = 0
'Recherche du handle de la fenêtre (hFen) selon le pID
hFen = OpenProcess(1, False, hApp)

Hélàs, le retour dans hFen ne correspond pas du tout au handle de la fenêtre à rechercher...
Si vous avez d'autres idées...

Cyril
0
cyrilpradel Messages postés 12 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 11:52
Je tiens à préciser que ce n'est pas le handle du processus que je cherche à récupérer en fonction du process ID mais le handle de la fenêtre lancée.

Cyril
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 déc. 2005 à 11:53
Tu demandes handle d'une appli (donc le prog) et ensuite tu dis que le handle ne correspond pas à une fenêtre, bien pour la cohérence.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cyrilpradel Messages postés 12 Date d'inscription mercredi 19 juin 2002 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 14:48
Voici donc le code exact :

Private Declare Function GetWindowThreadProcessId Lib "USER32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long


Private Declare Function GetParent Lib "USER32" (ByVal hwnd As Long) As Long


Private Declare Function GetWindow Lib "USER32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long


Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA"
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long


Private Const GW_HWNDNEXT = 2

-------------------------------------------------------------------

Public Function ProcIDFromWnd(ByVal hwnd As Long) As Long


'Renvoie l'id d'un processus à partir d'un handle de fenêtre


Dim idproc As Long


GetWindowThreadProcessId hwnd, idproc


ProcIDFromWnd = idproc


End Function

--------------------------------------------------------------------



Public Function GetWindowHandle (hInstance As Long) As Long





'Renvoie un handle de fenêtre à partir d'un id de processus


Dim tempHwnd As Long


tempHwnd = FindWindow(vbEmpty, vbEmpty)


Do Until tempHwnd = 0


If GetParent(tempHwnd) = 0 Then


If hInstance = ProcIDFromWnd(tempHwnd) Then


GetWindowHandle = tempHwnd


Exit Do


End If


End If


tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)


Loop


End Function




Et pour l'appeler :

Dim id As Long


id = Shell("notepad.exe")


MsgBox GetWindowHandle(id)

En espérant que ça pourra aider d'autres personnes,

A+

Cyril
0
Rejoignez-nous