lolpop
Messages postés211Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention18 octobre 2010
-
5 sept. 2006 à 20:21
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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++
Vous n’avez pas trouvé la réponse que vous recherchez ?
lolpop
Messages postés211Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention18 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?
lolpop
Messages postés211Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention18 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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.