IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Message sonore XP / SEVEN ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut Message sonore XP / SEVEN ?
    Salut tout le monde,

    Avant, sous windows XP, mes applications lançaient un message sonore sans aucun problème et l'application s'arrêtait tant que le message n'était terminé.
    Voici les fonctions que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Function MessageSonore(P_Fichier_wav)
        Application.ScreenUpdating = False
     
        WFichier_txt = G_DOSSIER_SPEECH & "\" & P_Fichier_wav
        If Test_Fichier("C:\windows\system32\sndrec32.exe", False) = True Then ' Windows XP
            If Test_Fichier(WFichier_txt, False) = True Then
                ShellWait "sndrec32 /play /Close " & WFichier_txt
            Else
                ShellWait "sndrec32 /play /Close " & G_DOSSIER_SPEECH & "\" & "message_sonore_inexistant.wav"
            End If
        Else 'Windows SEVEN
            If Test_Fichier(WFichier_txt, False) = True Then
                mciExecute ("play " & WFichier_txt)
            Else
                mciExecute ("play " & G_DOSSIER_SPEECH & "\" & "message_sonore_inexistant.wav")
            End If
        End If
    End Function
     
    Public Sub ShellWait(ByVal JobToDo As String)
    Dim hProcess As Long, RetVal As Long
     
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
        Do
            GetExitCodeProcess hProcess, RetVal
            DoEvents
    '        Sleep 10
        Loop While RetVal = STILL_ACTIVE
    End Sub
    Maintenant, sous SEVEN, je n'arrive pas à ce que l'application s'arrête le temps du message sonore.
    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je te renvoi à la dissolution que tu avais déjà ouverte:
    http://www.developpez.net/forums/d13...a/#post7462061
    les mêmes causes produisant souvent les mêmes effets.

  3. #3
    Invité
    Invité(e)
    Par défaut


    J'me disais bien, la fonction ShellWait(ByVal JobToDo As String) me rappelais quelque chose.

    En tout cas, à première vue, c'est assez bizarre qu'il y ai une parenthèse à la fonction mciexecute.
    Les fonctions prennent des parenthèse lorsqu'elle retourne quelquechose du style

    msgbox MaFonction(a)ou encore
    MaVariable = MaFonction(a)Je peux me tromper, mais il doit y avoir un message indiquant que ce n'est pas bon ?

  4. #4
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    Oui, oui, sauf que ça ne fonctionne pas.
    En fait ce n'est pas tout à fait le même problème.
    je n'arrive pas à passer en paramètre "mciExecute ("play " & WFichier_txt)"

    Les fonctions ShellWait ou LanceEtAttendLaFin plante.

    Je suis entrain d'essayer une autre solution, mais avec le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    Public Const INFINITE = &HFFFF
     
    Function MessageSonore(P_Fichier_wav)
        Application.ScreenUpdating = False
     
        WFichier_txt = G_DOSSIER_SPEECH & "\" & P_Fichier_wav
        If Test_Fichier("C:\windows\system32\sndrec32.exe", False) = True Then ' Windows XP
            If Test_Fichier(WFichier_txt, False) = True Then
                ShellWait "sndrec32 /play /Close " & WFichier_txt
            Else
                ShellWait "sndrec32 /play /Close " & G_DOSSIER_SPEECH & "\" & "message_sonore_inexistant.wav"
            End If
        Else 'Windows SEVEN
            If Test_Fichier(WFichier_txt, False) = True Then
    '            mciExecute ("play " & WFichier_txt)
    '            Sleep 5000 'Pause de 5 secondes
    WCommande = "mciExecute(play " & WFichier_txt & ")"
    LanceEtAttendLaFin (mciExecute("play " & WFichier_txt))
            Else
                mciExecute ("play " & G_DOSSIER_SPEECH & "\" & "message_sonore_inexistant.wav")
                Sleep 5000 'Pause de 5 secondes
            End If
        End If
    End Function
     
    Function LanceEtAttendLaFin(ByVal CheminComplet As String) As Long
        Dim ProcessHandle As Long
        Dim ProcessId As Long, ret&
     
        ProcessId = Shell(CheminComplet, vbNormalFocus)
        ProcessHandle = OpenProcess(&H1F0000, 0, ProcessId)
        LanceEtAttendLaFin = WaitForSingleObject(ProcessHandle, INFINITE)
     End Function

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui mais tu n'as pas supprimé les parenthèses après la fonction.

    Il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mafonction "Texte1", "Texte2"
    Les parenthèses se mettent lorsqu'une variable récupère une valeur provenant de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MsgBox MaFonction("Texte1", "Texte2")
    B = MaFonction("Texte1", "Texte2")
    Tu vois à peu près la différence ?

    En principe, il doit y avoir un message lorsque les parenthèses sont déclarées, non ?

    Je ne suit pas sûr, mais il me semble quand même que Shell sert uniquement aux .EXE (executable). Une petite confirmation serait la bienvenue, mais je crois que c'est réservé aux applications.

  6. #6
    Invité
    Invité(e)
    Par défaut
    je n'ai pas dit que nous avions apportés la solution, mais je voie que c'est bien le même problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    nous avion investigué la piste et envisagé un début de solution, je pense que ton dernier poste était plus avancé dans une éventuelle résolution.

    alors que là, juste ou pas, nous allons aborder les même éventualités et redire tous ce qui n'a vraisemblablement abouti.

  7. #7
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    LOL, je craque avec ce truc.

    Si je supprime les parenthèse, le mciExecute ne fonctionne plus.
    Si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LanceEtAttendLaFin ("notepad.exe")
    , ça fonctionne.
    La macro VBA s'arrête bien tant que le NOTEPAD n'est pas fermé.

    Par contre, la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mciExecute ("play " & WFichier_txt)
    fonctionne très bien, mais la macro ne s'arrête pas.

    Si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WCommande = mciExecute("play " & WFichier_txt)
    LanceEtAttendLaFin WCommande
    Dans ce cas-la, il passe le résultat de l'instruction en paramètre et non la l'instruction elle-même.
    La solution n'est pas loin, mais elle n'est pas là...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interdiction de clic durant un message sonore
    Par pelerin98 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/03/2015, 20h34
  2. message de contrôle sous seven
    Par cantador dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/02/2012, 18h12
  3. [OL-2007] Notification sonore/visuelle des nouveaux messages
    Par gassisprog dans le forum Outlook
    Réponses: 1
    Dernier message: 29/04/2011, 17h54
  4. [Audio] Diffusion d'un message sonore
    Par mimi51340 dans le forum Multimédia
    Réponses: 12
    Dernier message: 10/06/2008, 13h55
  5. [c#] message sonore
    Par DavidPAY dans le forum C#
    Réponses: 2
    Dernier message: 26/10/2007, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo