LANCER UN FICHIER ET RÉCUPÉRER LE HANDLE DE L'APPLICATION LANCÉE

Messages postés
206
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009
- - Dernière réponse : Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
22 août 2018
- 26 oct. 2007 à 08:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23215-lancer-un-fichier-et-recuperer-le-handle-de-l-application-lancee

Afficher la suite 
l0st3d
Messages postés
206
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009
-
heuuu ouain en tk... pourquoi vous les francais vous essayer toujour de trouver des solutions au probleme qu'on ne cherche pas ET NE VENEZ PAS CONTREDIRE VOUS ETES COMME SA (bon pas tous mais beaucoup)! Je n'ai aucun probleme a trouver le hwnd d'un app si je cherche le nom GNEH! rien de plus facile!
l0st3d
Messages postés
206
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009
-
P.S J'ai rien contre toi, j'ai jeter un oeuil a ton code et puis c'est tres bien.
cs_OphidiaN
Messages postés
235
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
9 novembre 2007
-
ouais ... enfin bon.... un module dont on se sert tous les jours c fun ça :)

g commenté la source de l0st3d avec le meme genre ke ta source (javais pas vu que yavait deja une replique), excepté ke j'évite une tonne de truc inutiles....

faudrait cree une dll qui possède la capacité de renvoyer un handle au lieu d'un processID, ça serait.... bien! (pcq passer par CreateProcess c un peu pompeux...)
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
LOL. Utilise pas une diff de date. Je crois que ça serait beaucoup mieux d'utiliser GetTickCount, prendre une mesure juste avant la boucle et attendre jusqu'à ce que GetTickCount ­> sa vieille valeur + 10000. Et du dit OU pour la boucle alors que c'est ET.
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 -
Merci de vos comments.
DeadlyPredator : Et quand tu fais ton test aux alentours de minuit, il se passe quoi ? (un retour à zéro --> tu vas pouvoir attendre longtemps)
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
Ouais. c'est vrai pour GetTickCount, de ce côté là ... J'ai trouvée une belle façon de lancer des progs en VB et de récupérer leur ExitCode. Il est utilise car il attent la fin du prog et permet de spéficier plein d'options. Voici son code :
'<
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const INFINITE = &HFFFF
Private Const STARTF_USESHOWWINDOW = &H1
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Enum Process_Priority
NORMAL_PRIORITY_CLASS = &H20
IDLE_PRIORITY_CLASS = &H40
HIGH_PRIORITY_CLASS = &H80
End Enum
Public Enum WindowSates
SW_HIDE = 0
SW_NORMAL = 1
SW_MAXIMIZE = 3
SW_MINIMIZE = 6
End Enum
Function LaunchAndWait(AppPath As String, WorkPath As String, ExitCode As Long, Optional Priority As Process_Priority NORMAL_PRIORITY_CLASS, Optional WindowSate As WindowSates SW_NORMAL, Optional WaitTime As Long = INFINITE) As Boolean
Dim handle As Long
Dim StartDat As STARTUPINFO, pInfo As PROCESS_INFORMATION
With StartDat
.cb = Len(StartDat)
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = WindowState
End With
handle = CreateProcess(vbNullString, AppPath, ByVal 0&, ByVal 0&, False, CLng(Priority), ByVal 0&, WorkPath, StartDat, pInfo)
If handle = 0 Then Exit Function 'WTF!!!
WaitForSingleObject pInfo.hProcess, WaitTime
GetExitCodeProcess pInfo.hProcess, ExitCode
LaunchAndWait = True
End Function
'>
Chez moi ça marche correct. Voici comment on l'utilise :
'<
Dim ec As Long'Pour stocker le ExitCode
MsgBox LaunchAndWait("app", "app path", ec)'RETOURNE TRUE SI OK
MsgBox ec 'On fait ce qu'on veut avec le ExitCode
'>
Je crois que les anti-virus utilisent ça pour retourner si le fichier qu'on à fait scanné à partir de la ligne de commande, est contaminé ou non.
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
p.s. ce module est de moi
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 -
Re DeadlyPredator
C'est surement très bien, mais avec ton code, tu ne peux lancer que des exécutables. On n'y retrouve pas la fonctionnalité bien pratique du ShellExecute qui va rechercher quelle est l'application par défaut associée au fichier que tu lui donnes.
Pour info : erreur de saisie du paramètre optionnel WindowState (manque le t)
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
c'est pas un problème. Tu fait lancer le prog par shellExecute et tu utilise le handle retourné à la place de pinfo.hprocess je crois
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 -
Ce serait trop beau : ShellExecute ne renvoit qu'un code de résultat et pas le handle (d'où l'utilité de cette source ... et la boucle est bouclée)
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
STUPIDE MICROSOFT!!! Y PENSENT TU DESFOIS?
philippe laschweng 1
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
-
Salut,

Exactement ce que je recherchais. Simple et efficace !
Dommage que tu n'es pas laissé le commentaire suivant dans ton module (Case 42) :
pas d'erreur, c'est Lesieur .... LOL

Merci
Bye
Philippe
Leo_Robotic_Passion
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011
-
Bonjour a tous,

Pourrais-je avoir un exemple simple de l'utilisation de ce module svp ?
Un bouton, un clique et exécution de notepad par exemple !

Merci d'avance

Cordialement

Léo
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 -
Salut Leo
Rien de compliqué !
Dans Command1_Click(), tu mets
MsgBox "Le Handle = " & CStr(LanceShell("C:\mon fichier.txt", True, True))
Leo_Robotic_Passion
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011
-
Merci Jack :)
et sans le msgbox ca donnerait ?
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 -
Re
Léo, le but de cette source est :
- de lancer l'exécutable associé au fichier qu'on veut lancer. Ca, c'est le rôle de ShellExecute.
- de récupérer le handle de l'application qui vient d'être lancée (à condition que cela ne lance pas une forme enfant).

Donc, oui, sans le MsgBox, tu peux lancer cette fonction :
Call LanceShell("C:\mon fichier.txt", True, True)
mais ce n'est pas le but premier de cette source.

Je sens que tu n'es pas très à l'aide avec le VB.
Si tu as des questions de programmation, fais des recherches dans les questions du forum et/ou pose des question sur le forum, c'est fait pour ça.
Leo_Robotic_Passion
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011
-
Certes je suis novice avec vb je l'utilise pour créer des applications simple, ton source peux je l'espère palier un problème que j'ai avec l'utilisation de shell pour appeler un exécutable !
Exemple : shell « c:\program Files\blabla.exe »
Le soft appelé est minimisé dans la barre de taches car mon interface semble garder le focus !
Apres un 1er test ton module semble résoudre le problème mais est ce la bonne solution ????

Cordialement
Léo
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 -
Re
Regarde dans l'aide de la fonction Shell : Tu choisis le comportement du Shell : Normal, minimisé, avec ou sans focus ...
S'il te plait : va poser tes questions dans le forum, c'est fait pour ça
phixfoxphixfox
Messages postés
2
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
-
une question certainement très bête !!
j'ai essayé d'envoyer des caractères en utilisation ton module que je trouve très bien et aussi le code SendkeysEX
mais .... que neni
ca ne marche absolument pas :(

pourrais tu donne un exemple pour utiliser ton handle afin d'envoyer quelque petits caractères

merci ^par avance
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 -
Désolé, ça sort de l'utilisation de cette source.
Pose simplement la question sur le forum :
"Comment utilisé SendKeyEx une fois qu'on a le handle de destination"
Fais aussi une simple recherche avec le mot "SendKeysEx" parmi les sources et les questions du forum, tu auras plus de chance de trouver ta réponse.
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
22 août 2018
54 -
la fenetre cible risque de ne pas etre interessée par la pression de tes touches...

cible plutot un textbox qu'elle contient, par exemple (voir Spy++ et l'APi FindWindowEx)