Attendre la fermeture d'un fichier

djborie65 Messages postés 2 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 1 mai 2007 - 30 avril 2007 à 18:32
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 1 mai 2007 à 17:55
Bonjour,

Je souhaite exécuter un fichier avec son programme par défaut, puis attendre la fermeture de celui-ci.
J'ai déjà trouvé un code source qui fonctionne, seulement ça attend que le programme se termine, donc cela ne fonctionne pas si un fichier associé au programme par défaut est déjà ouvert.

Quelqu'un a-t-il une solution ?

Merci

5 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 avril 2007 à 18:38
Bonjour,
Il te suffit alors de faire une boucle avec gestion d'erreur

Mais je ne comprends pas bien le sens de ta phrase :
"donc cela ne fonctionne pas si un fichier associé au programme par défaut est déjà ouvert."
N'importe quel autre fichier ouvert par ce programme par défaut ou le seul fichier que tu veux ouvrir et qui serait déjà ouvert ?
Si la 2ème hypothèse est la vraie : ouvert par qui et comment, alors ? (car ta boucle d'attente risque fort de paralyser longtemps si tu dépends d'un autre programme ou d'un autre utilisateur ...)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
30 avril 2007 à 18:41
Regarde ma source sur l'ouverture d'un fichier, j'ai implémener justement une attente de fermeture.

Mais comme tu l'as dis dans ma source aussi, l'attente se fait sur un fichier ouvert par l'appli.

Pou un fichier déjà ouvert, il va falloir récupérer le pid du process. Il faudrait donc modifier la source pour que la variable pid représente le id du process déjà ouvert et non pas celui ouvert par l'instruction Shell.

Pour récupérer le pid, il doit falloir utiliser je pense les api GetWindows et GetWindowThreadProcessId

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
30 avril 2007 à 19:06
Petite modif rapide :

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, _
       ByVal lpDirectory As String, _
       ByVal lpResult As String) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
       ByVal bInheritHandle As Long, _
       ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
       ByVal dwMilliseconds As Long) As Long

Private Const INFINITE = &HFFFFFFFF ' Infinite timeout
Private Const SYNCHRONIZE = &H100000

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Sub AttenteFermeture(nom_appli As String)
Dim pid As Long
Dim pid1 As Long
Dim phnd As Long
Dim hWnd As Long

   hWnd = FindWindow(nom_appli, vbNullString)
   pid = GetWindowThreadProcessId(hWnd, pid1)
   
   If pid <> 0 Then
       phnd = OpenProcess(SYNCHRONIZE, 0, pid1)
       If phnd <> 0 Then
           Call WaitForSingleObject(phnd, INFINITE)
           Call CloseHandle(phnd)
       End If
       
       MsgBox "Fichier fermé"
   Else
       MsgBox "Fichier pas trouvé"
   End If
End Sub
, ----
[code.aspx?ID=41455 By Renfield]

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
djborie65 Messages postés 2 Date d'inscription mercredi 11 avril 2007 Statut Membre Dernière intervention 1 mai 2007
1 mai 2007 à 16:50
Ben en fait ce que je veux récupérer, c'est la fermeture du fichier, et non de l'application.
Par exemple, si j'ouvre 2 fichiers "toto.doc" et "titi.doc", je voudrais récupérer séparément la fermeture de ces deux fichiers.

Est-ce possible ?
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
1 mai 2007 à 17:55
Il faudrait effectivement pouvoir récupérer le pid de chacune des fenetres, surtout celle correspondant au fichier à surveiller.

Chose que je n'arrive pas à faire malgré mes essais. C'est toujours l'application que je scrute.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
Rejoignez-nous