Shellexecuteex : ouvrir fichier avec son lecteur par défaut (et le fermer)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 302 fois - Téléchargée 30 fois

Contenu du snippet

Ce code permet d'ouvrir un fichier avec son lecteur par défaut (en fonction du lien de la base de registre entre l'extension du fichier et un programme exécutable pour l'ouvrir).

On récupère le Handle (hWnd) du programme lançé et on peut ainsi fermer le programme lançé avec le ficheir quand on veut depuis son programme VB.

Source / Exemple :


Option Explicit

'Flags ShellExecuteEx
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Const SEE_MASK_FLAG_NO_UI = &H400

'Constantes ERREUR ShellExecuteEx
Private Const SE_ERR_FNF As Byte = 2
Private Const SE_ERR_PNF As Byte = 3
Private Const SE_ERR_ACCESSDENIED As Byte = 5
Private Const SE_ERR_OOM As Byte = 8
Private Const SE_ERR_SHARE As Byte = 26
Private Const SE_ERR_ASSOCINCOMPLETE As Byte = 27
Private Const SE_ERR_DDETIMEOUT As Byte = 28
Private Const SE_ERR_DDEFAIL As Byte = 29
Private Const SE_ERR_DDEBUSY As Byte = 30
Private Const SE_ERR_NOASSOC As Byte = 31
Private Const SE_ERR_DLLNOTFOUND As Byte = 32

'Constantes AFFICHAGE ShellExecuteEx
Private Const SW_SHOWNORMAL = 1
Private Const SW_SHOW = 5
Private Const SW_SHOWDEFAULT = 10

Private Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hWnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type

'OpenProgram
Private Declare Function ShellExecuteEx Lib "shell32.dll" _
(SEI As SHELLEXECUTEINFO) As Long

'CloseProgram
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)

' ***********************************************************
' *                                                         
' * Lance le programme par défaut associé à un fichier (en fonction de son
' * extension ) et retourne le hWnd de la fênetre du programme lançé.   
' *                                                         
' ***********************************************************

Public Function OpenProgram(ByRef FileName As String, ByRef OwnerhWnd As Long) As Long
    Dim SEI As SHELLEXECUTEINFO
    
    On Error GoTo ErrorHandler
    
    'Vérifie si le fichier à lancer est un exécutable (.exe)
    If GetExtension(FileName) = "exe" Then
        If vbNo = MsgBox("ATTENTION, êtes-vous sûr de vouloir lancer ce programme exécutable ?", vbExclamation + vbYesNo) _
        Then
            OpenProgram = 0
            Exit Function
        End If
    End If

    With SEI
        .cbSize = Len(SEI)
        .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_NO_UI
        .hWnd = OwnerhWnd
        .lpVerb = "open"
        .lpFile = FileName
        .lpParameters = vbNullChar
        .lpDirectory = vbNullChar
        .nShow = SW_SHOW
        .hInstApp = OwnerhWnd
    End With
    
    OpenProgram = ShellExecuteEx(SEI)
    
    If SEI.hInstApp <= 32 Then
    'Erreurs
        OpenProgram = 0
        
        Select Case SEI.hInstApp
            Case SE_ERR_FNF
                OpenProgram = SEI.hProcess
            Case SE_ERR_PNF
                MsgBox "Le chemin du fichier à ouvrir est incorrect.", vbExclamation
            Case SE_ERR_ACCESSDENIED
                MsgBox "Accès au fichier refusé.", vbExclamation
            Case SE_ERR_OOM
                MsgBox "Mémoire insuffisante.", vbExclamation
            Case SE_ERR_DLLNOTFOUND
                MsgBox "Dynamic-link library non trouvé.", vbExclamation
            Case SE_ERR_SHARE
                MsgBox "Le fichier est déjà ouvert.", vbExclamation
            Case SE_ERR_ASSOCINCOMPLETE
                MsgBox "Information d'association du fichier incomplète.", vbExclamation
            Case SE_ERR_DDETIMEOUT
                MsgBox "Opération DDE dépassée.", vbExclamation
            Case SE_ERR_DDEFAIL
                MsgBox "Opération DDE echouée.", vbExclamation
            Case SE_ERR_DDEBUSY
                MsgBox "Opération DDE occupée.", vbExclamation
            Case SE_ERR_NOASSOC
                'Ouvrir avec...
                Call Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " + FileName, vbNormalFocus)
        End Select
    Else
        'Retourne le hWnd du programme lançé par ShellExecuteEx
        OpenProgram = SEI.hProcess
    End If
    
    Exit Function
ErrorHandler:
    OpenProgram = 0
End Function

' ***********************************************************
' *                                                         
' * Ferme un programme à partir du hWnd de sa fenêtre.      
' *                                                         
' ***********************************************************

Public Function CloseProgram(hWnd As Long) As Boolean
    Dim lExitCode As Long
    
    If hWnd = 0 Then
        Exit Function
    End If
    
    CloseProgram = CBool(TerminateProcess(hWnd, lExitCode))
    CloseHandle hWnd
    DoEvents
    Sleep (100)
    
End Function

Conclusion :


Exemple d'utilisation :
PhWnd as Long

'*************************************
'Pour ouvrir le fichier avec le Viewer par défaut
PhWnd = OpenProgram ("c:\\document1.doc", Me.hWnd)

'***************************
'Pour fermer le viewer par défaut
Call CloseProgram (PhWnd)

A voir également

Ajouter un commentaire

Commentaires

Vedlen
Messages postés
359
Date d'inscription
mardi 14 octobre 2003
Statut
Membre
Dernière intervention
7 septembre 2009
-
Super, mais tu devrais éventuellement rajouter la fonction GetExtension dans le code au lieu de le faire dans le forum. Cependant je ne suis pas sûr qu'elle soit vraiment utile... 10/10
FRSANGC
Messages postés
3
Date d'inscription
dimanche 25 décembre 2005
Statut
Membre
Dernière intervention
8 décembre 2009
-
Bonsoir,

Tous mes bons voeux pour cette nouvelle année.

Je débute en vb et je voudrais pouvoir ouvrir un fichier PDF à partir d'un fichier excel via Visual Basic.
J'ai trouvé ce code je prense que c est exactement ce que je recherche mais je ne vois pas comment exécuter l'ouverture ou la fermeture du fichier pdf.
En fait je voudrais avoir un BOUTON OUVRIR et un BOUTON FERMER qui en cliquant dessus ouvre le fichier Pdf (on va dire que le fichier est en C:\dossier\plan.pdf.
Si vous pouviez m aider ce serait sympa c est pour le boulot
Antoine
Mon mail antoine5945@hotmail.fr
cs_bastogne
Messages postés
5
Date d'inscription
mercredi 24 mars 2004
Statut
Membre
Dernière intervention
8 novembre 2005
-
avec ce source (adapté à ma sauce) j'essaye de lancer l'application 'runas.exe' en lui rentrant des parametres en plus par rapport au source le problème est que j'obtient le message d'erreur "accès au fichier refusé" or j'ai les droits administrateur sur ma machine et que manuellement j'arrive à lancer correctement l'appli runas, si quelqu'un peut m'aider ce serait gentil
cs_smellycat
Messages postés
6
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2004
-
Ce source ne marche pas avec les programmes installés avec Microsoft INstaller, ainsi que les progs Word, excel et autres ....
jockos
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2 -
Pour les codes d'erreur, je vais les rajouté à ma source...

A+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.