Récupérer le handle après un shellexecute

Soyez le premier à donner votre avis sur cette source.

Vue 17 255 fois - Téléchargée 1 383 fois

Description

Bon, ça y est. Après un week-end entier à m'arracher le peu de cheveux qui me reste, voilà une version complète.
Deux projets dans ce ZIP :
- La 1ere version utilise la fonction Shell (tout en gardant la possibilité de lancer directement un fichier TXT)
- La 2ème version utilise ShellExecuteEx qui recherche elle même le programme associé. Mais la difficulté majeure était de retrouver le lien entre le paramètre hProcessId qu'elle fournit, avec le handle réelle de la fenêtre affichée.

Je remercie BruNews, RenField et Draluorg au travers de leurs échanges.
J'étais dans la bonne voie, mais c'est l'organisation interne de Windows que je ne connaissais pas suffisemment.

Ceci répondra à la question de LOLPOP sur le forum (au moins).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
ShellERxecuteEx() retourne un hprocess valide (sinon à quoi bon...).
pid = GetProcessId(hprocess);
Tout ce qu'il faut ici:
http://www.vbfrance.com/forum.v2.aspx?ID=808860
cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
59 -
Ok BruNews. Merci pour le lien vers cette API purement XP (et +).

Je viens de l'essayer avec cette syntaxe que je pense être bonne puisqu'elle renvoie bien une valeur (PID), mais ce PID n'apparait pas parmi les Thread.
Private Declare Function GetProcessId Lib "kernel32" (ByVal hProcessId As Long) As Long

Si qqun arrive à construire une structure de recherche convenable ...
cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
59 -
(*) Sous VB6, il n'existe aucune syntaxe officielle de cette API GetProcessId - peut-être un problème de compatibilité | type de var
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Nenni, aucune incompatibilité puisque qu'elle ne prend qu'un param 32 bits et en retourne un autre.
Il n'y a pas de syntaxe "officielle" des APIs en VB, la seule doc officielle est MSDN.
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
Salut a tous,

D'accord avec BruNews, il faut utiliser ShellExecuteEx

Voici une exemple vite fait:

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
Private Declare Function GetProcessId Lib "kernel32" (ByVal hProcessId As Long) As Long

Private Type SHELLEXECUTEINFOA
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type

Private Const SEE_MASK_DOENVSUBST As Long = &H200
Private Const SEE_MASK_IDLIST As Long = &H4
Private Const SEE_MASK_NOCLOSEPROCESS As Long = &H40

Public Function ShellEx(ByRef vsCmdLine As String) As Long

Dim lpShellExInfo As SHELLEXECUTEINFOA

With lpShellExInfo
.cbSize = Len(lpShellExInfo)
.lpVerb = "open"
.lpFile = vsCmdLine
.nShow = 0
.fMask = SEE_MASK_DOENVSUBST Or SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_IDLIST
End With

If ShellExecuteEx(lpShellExInfo) Then
ShellEx = GetProcessId(lpShellExInfo.hProcess)
CloseHandle lpShellExInfo.hProcess
Else
ShellEx = 0
End If

End Function

++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.