Récupérer un handle avec un shellexecute.

lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010 - 5 sept. 2006 à 20:21
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 9 sept. 2006 à 10:58
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

Utilisateur anonyme
5 sept. 2006 à 22:18
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
5 sept. 2006 à 23:28
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
5 sept. 2006 à 23:34
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
6 sept. 2006 à 00:08
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++
0

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

Posez votre question
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
6 sept. 2006 à 00:15
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?
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
6 sept. 2006 à 09:04
Bonjour,


lolpop, pourrais-tu mettre ton exemple avec getwindowtext et enumwindow ?
Car moi j'ai un petit pb pour récupérer le handle.
0
lolpop Messages postés 211 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 18 octobre 2010
6 sept. 2006 à 17:10
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
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
6 sept. 2006 à 17:53
merci.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
8 sept. 2006 à 20:43
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
8 sept. 2006 à 21:11
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++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
8 sept. 2006 à 21:15
OUPS rectif:


pas un PID mais le hprocess du processus lancé.


Ensuite: pid = GetProcessId(hprocess);


voila tout.

ciao...
BruNews, MVP VC++
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
9 sept. 2006 à 03:58
Tiens LOLPOP
Je t'ai fait une petit appli de démo : http://www.vbfrance.com/code.aspx?ID=39492
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
9 sept. 2006 à 04:06
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.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
9 sept. 2006 à 10:58
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++
0
Rejoignez-nous