pronche
Messages postés5Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention 5 août 2004
-
4 août 2004 à 11:35
pronche
Messages postés5Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention 5 août 2004
-
5 août 2004 à 12:06
bonjour!
voila, lorsque je ferme word, je souhaiterias lancer un programme qui va "guetter" la fermeture effective de celui ci (pour s'assurer que l'utilisateur a bien sauvegarer ou non le document apres la boite de dialogue word "sauvegarder et quitter? Oui Non Annuler")...
pour cela je lance une command shell avec des arguments (le path du fichier word en question).
ensuite mon programme attend que le fichier en question ne soit plus marqué comme ouvert... mais voila... cela peu prendre longtemps et en attendant, je fais une boucle infi qui bouffe tout le CPU. ou bien je fasi un sleep(1) qui se repère infiniment et dans ce cas je ne peux pas aller autre part que dans word.. cela freeze les autres applications (a cause de la gestion de priorité aparement)
si qqun pouvais m'aider ce serais génial !
je développe en VB6
voila... en vous remerciant
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 5 août 2004 à 01:17
Un début de solution (code trouvé je ne sais plus sur quel site. mvps.org ou similaire) :
dans un module :
**************************
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As Long, ByVal lpCommandLine As String, _
ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'Type pour gérer les lancements de processus
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 Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
'Info sur un processus
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Public Enum TypeOpen
Hide = 0
Normal = 1
Minimized = 2
Maximized = 3
Restore = 9
End Enum
Public Enum OP
OpExecute = 1
OpPrint = 2
End Enum
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const STILL_ACTIVE = &H103&
Public Sub AttendreFinProcess(proc As PROCESS_INFORMATION, Optional timeout As Long = 60)
Dim ret As Long
Dim tms As Single
Dim exitcode As Long
'Attendre la fin de la commande
tms = Timer
ret = GetExitCodeProcess(proc.hProcess, exitcode)
Do While ret <> 0 And exitcode = STILL_ACTIVE
ret = GetExitCodeProcess(proc.hProcess, exitcode)
DoEvents
Sleep 100
If Timer - tms > timeout Then
Err.Raise STILL_ACTIVE, "AttendreFinProcess", "Timeout sur l'attente de la fin d'un process"
End If
Loop
If ret = 0 Then
Err.Raise Err.LastDllError, "AttendreFinProcess", "Erreur systeme N° " & Err.LastDllError
End If
End Sub
Public Sub LancerProcess(sExe As String, proc As PROCESS_INFORMATION)
Dim start As STARTUPINFO
Dim ret As Long
'StartupInfo pour le processus qui lancera la commande
start.cb = Len(start)
'Lancement de la commande
ret& = CreateProcess(0&, sExe, 0&, 0&, 0&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
If ret = 0 Then
Err.Raise Err.LastDllError, "LancerProcess", "Erreur systeme N° " & Err.LastDllError
End If
End Sub
**************************
Dans un formulaire (avec un bouton de commande Commande0 :
Test avec NotePad
**************************
Private Sub Commande0_Click()
Dim proc As PROCESS_INFORMATION
On Error GoTo errortag
proc.hProcess = -1
proc.hThread = -1
Debug.Print "Debut du processus"
Call LancerProcess("notepad", proc)
Call AttendreFinProcess(proc)
MsgBox "fin du processus"
Call CloseHandle(proc.hProcess)
Call CloseHandle(proc.hThread)
Exit Sub
errortag:
If proc.hProcess <> -1 Then CloseHandle proc.hProcess
If proc.hThread <> -1 Then CloseHandle proc.hThread
MsgBox Err.Number & " - " & Err.Description
End Sub
************************
Ca fonctionne très bien sous Access 2000. Donc sans doute sous VB6.
pronche
Messages postés5Date d'inscriptionmercredi 4 août 2004StatutMembreDernière intervention 5 août 2004 5 août 2004 à 12:06
merci ton truc est génial... a un détail près qui m'embète pas mal...
en fait je me trouve dans une macro Word, et de là je fais un shell
qui lance mon exe qui guette la fin de word...
du coup dans mon exe, je met le code que tu m'as passé et en théorie ca passe... mais le problème (car il y en a un :'() c'est que mon exe en connais pas tous les codes
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
qui correspondent a Word qui vient de le lancer...