Récupérer un handle avec un shellexecute.

Signaler
Messages postés
211
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
18 octobre 2010
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour,
j'utilise un shellexecute pour lancer une page dans le navigateur et je souhaiterai récupérer le hwnd de la fenetre qui est lancé.
Y a t'il une possibelité simple.
Car en ce moment je fai avec enumwindow et getwindowtext pour rechercher la fenetre et je prend le handle, mais je voulais savoir si il été possible de récupéré directement le handle avec le shellexecute.
Merci

14 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
35
Salut,

L'api de retourne l'hwnd de la fenetre lancé.
Y'a pas a chercher loin.




Kenji



Il était une fois, un pauvre petit règlement que personne ne lisait. Il est tout sympa mais il est triste, aidez-le, lisez-le, ca lui ferait tellement plaisir ainsi qu'a nous. Merci.
Ca sent le sondage sur ce lien
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Et non, Charles, je ne pense pas.
De mémoire (mon API-Guide étant dans le sac), ShellExecute renvoie une valeur, en général 32, qui dit si l'opération s'est bien déroulée.
--> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp
Shell (tout court), lui, renvoie le ProcessID.
Il doit surement être possible de retrouver le Handle à partir du Pid ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Et pour répondre à ta question (j'avais zoublié) :
J'ai personnellement cherché, il y a un bout de temps, sans trouver.
Je me suis donc rabattu sur la recherche du Handle à partir du nom des fenêtres grace à cette Sub :
-- Dans la partie déclaration :
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Const GW_HWNDFIRST As Long = 0
Private Const GW_HWNDLAST As Long = 1
Private Const GW_HWNDNEXT As Long = 2
Private Const GW_HWNDPREV As Long = 3
Private Const GW_CHILD = 5
-- La fonction
Private Function HwndFenetre(ByVal Texte As String) As Long
    ' Recherche le handle de la première fenêtre contenant
    '   le Texte dans le titre
    Dim Titre As String, hWnd As Long, r As Long
    ' Handle du bureau
    hWnd = GetDesktopWindow()
    ' Cherche la première fenêtre lui appartenant
    hWnd = GetWindow(hWnd, GW_CHILD)
    Do While hWnd <> 0
        ' Récupère le nom de la fenêtre
        Titre = String(255, " ")
        r = GetWindowText(hWnd, Titre, 255)
        Titre = Left(Titre, r)
        ' Terminé si le nom correspond
        If UCase(Titre) Like UCase("*" & Texte & "*") Then
Debug.Print Titre
            HwndFenetre = hWnd
            Exit Do
        End If
        ' Sinon, cherche la fenêtre suivante
        hWnd = GetWindow(hWnd, GW_HWNDNEXT)
        DoEvents
    Loop
End Function

J'espère que ça pourra s'appliquer à ton cas.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
ShellExecuteEx donne le pid de processus.
Lance le EnumWindows et dans l'enumProc tu stoppes quand GetWindowThreadProcessId() donnera lemême pid que celui récupéré précédemment.

ciao...
BruNews, MVP VC++
Messages postés
211
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
18 octobre 2010

Merci de vos réponses
et bien je le faisait aussi avec les api avec getwindowtext et enumwindow.
Mais c'était pour savoir si y avait pas une méthode plus facile poru le faire c'est tout.

Quel est la différence entre shell et shellexecute?
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,


lolpop, pourrais-tu mettre ton exemple avec getwindowtext et enumwindow ?
Car moi j'ai un petit pb pour récupérer le handle.
Messages postés
211
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
18 octobre 2010

oui voila de quoi je me sert :

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim sSave As String
    'Get the windowtext length
    sSave = Space$(GetWindowTextLength(hwnd) + 1)
    'get the window text
    GetWindowText hwnd, sSave, Len(sSave)
    'remove the last Chr$(0)
    sSave = Left$(sSave, Len(sSave) - 1)
   
    If nomfenetre = "" Then Exit Function
   If InStr(sSave, nomfenetre) <> 0 Then
       'Ferme la fenêtre
       'Call PostMessage(hwnd, WM_CLOSE, 0, vbNull)
       handleiframe = hwnd
        End If
    'continue enumeration
    EnumChildProc = 1
End Function
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

merci.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Re
Non BrunNews, le hProcess renvoyé par ShellExecuteEx ne correspond pas à un vrai ProcessId.
Personne (MSDN, Forums, ...) ne sait vraiment à quoi correspond ce hProcess.
Il n'est pas possible de retrouver le ProcessId (donc le handle) à partir de ces données.

Par contre, avec Shell (tout court), on peut retrouver ce handle puisqu'il fournit un vrai ProcessId
La solution pour lancer des fichiers .DOC ou .TXT à la manière de ShellExecute serait :
- Rechercher l'executable associé à l'extension du fichier que l'on veut lancer (avec ça, par exemple)
- Utiliser Shell en combinant le chemin de l'EXE et le fichier à lancer
- Avec le ProcessId fournit par le Shell, retrouver le Handle (regarde l'exemple fourni par OPHIDIAN dans les commentaires de cette source)
Malgré tout, il faudra se méfier de Shell qui fonctionne en assynchrone, c'est à dire que rien ne garantit que l'application lancée avec le Shell ait terminé de s'afficher en sortie de Shell.
La solution consiste donc à vérifier que l'application soit prête à recevoir des infos du clavier avec ce genre de boucle
            Do While IsWindowEnabled(hWnd) = 0
                DoEvents
            Loop
Alors seulement on pourra envoyer des commandes du style
            SetForegroundWindow (hWnd)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Mais si que c'est le bon pid, ShellExecuteEx n'est qu'un wrapper de CreateProcess en offrant seulement moins de controle que ce dernier.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
OUPS rectif:


pas un PID mais le hprocess du processus lancé.


Ensuite: pid = GetProcessId(hprocess);


voila tout.

ciao...
BruNews, MVP VC++
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Tiens LOLPOP
Je t'ai fait une petit appli de démo : http://www.vbfrance.com/code.aspx?ID=39492
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
BruNews
Vas-y, fait le marcher : je suis intéressé
J'ai regardé le GetProcessID : pas trouvé d'API qui s'appelle comme ça.
Seule existe GetCurrentProcessId sans paramètre, mais qui ne résoud pas du tout le problème

Si tu as un exemple de transformation du hProcess en PID, je suis preneur.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Voila pour jack l'incrédule (he he), exemple ici (en C bien entendu...):http://bnmvp.free.fr/NtpdTxt.zip
exe fait 4,5 Ko, projet avec code complet dans zip.
Champs Titre et Texte à remplir, ensuite clic sur bouton Notepad qui ouvrira une fenêtre de notepad avec textes indiqués et SANS fichier txt sur disque.

Emploi de GetProcessId(): fichier TxtNpd.c ligne 31.

Infos MSDN:
http://msdn.microsoft.com/library/en-us/dllproc/base/getprocessid.asp

ciao...
BruNews, MVP VC++