Afficher un msgbox au premier plan

Résolu
Bonjour,
J'ai fais un programme avec microsoft visual basic 2010 express. ce programme est tout simple : je rentre un nombre d'heure, de minutes et de secondes et il fait le décompte. lorsque j'arrive a la fin, j'affiche un msgbox pour prévenir que c'est la fin. jusque la, aucun probleme.
mon probleme viens du fait que lorsque le décompte se termine et que je travaille sur un autre logiciel a ce moment la, il n'affiche pas la fenetre au premier plan et je ne vois donc pas que c'est terminer.
je n'ai trouvé aucune solution sur internet.

Merci par avance pour vos réponses

18 réponses

  1. Bonjour,
    J'ai adapté ton idée pour avoir exactement le volume que je veux :
    je baisse le son 50 fois car le son maximal de mon pc est 100 et la ligne
    SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr))

    baisse de 2, comme ca je suis a 0 et apres j'augmente du nombre de fois que je veux (par exemple 15 fois si je veux un volume de 30) et au passage ça enlève le muet. ça donne :
    For i = 1 To 50
    SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr))
    Next
    For i = 1 To 15
    SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))
    Next

    ce n'est pas très optimiser mais ça marche bien.
    merci beaucoup pour ton aide !
    0
    1. Contributeur
      Ce que tu veux faire c'est une application de contrôle du son. Je pense que pour l'associer à ton MsgBox c'est un peu trop lourd. Je te propose une alternative.

      Quand tu mets ceci pour monter le son, cela supprime le mode muet:

      SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))


      Si tu le mets 3 fois cela augmente de 3 fois, j'ai fait l'essai:

        SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))
              SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))
              SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))


      L'avantage avec 3 lignes de code, tu supprimes le mode muet et tu montes le son 3 fois plus fort.

      Bon WE
      0
      1. J'ai trouvé ! Il fallait utiliser la fonction CInt() pour convertir ma variable.
        Donc le code que tu m'a donné marche bien mais j'ai un autre problème, c'est que si le son est allumé et que je fait mute, ça éteint le son. Deuxièmement, je peux augmenter et diminuer le son mais je ne peut pas choisir une valeur fixe or moi j'aimerais allumer le son et fixer sa valeur de façon a que ce soit toujours la même et les fonctions que tu m'a donner ne me permettent pas de le faire.
        connait tu un moyen de fixer le son a une certaine valeur ou de connaitre sa valeur actuelle pour augmenter ou diminuer de ce qu'il faut ?
        0
        1. Contributeur
          Normalement tu as tes variables qui affichent l'erreur en rouge, il suffit de faire un clic droit dessus pour la corriger. Sinon le plus simple c'est de supprimer cette ligne

          Option Strict On

          Je mets Option Strict On pour coder proprement, c'est une bonne habitude à prendre

          0
          1. Le code que vous m'avez donner marche bien mais j'ai compris ce qu'il ne va pas :
            j'ai les variables h,m et s qui correspondes aux heures, minutes et secondes de mon compte à rebour or ces informations, je les récupère dans des textbox. normalement, il fait bien la conversion string->integer mais avec les lignes
            Option Strict On
            Imports System.Runtime.InteropServices

            il ne veut plus faire la conversion d'un type a un autre. Avez-vous une idée ?
            0
            1. Contributeur
              Bien sur que je l'ai testé!

              voilà, essaie le:

              http://www.cjoint.com/data3/3AjiiXwTTly.htm
              0
              1. Contributeur
                Tu as de la chance, j'ai trouvé ce que tu cherches!!!

                Tu mets 3 buttons avec ce code:

                Option Strict On
                Imports System.Runtime.InteropServices
                Public Class Form1
                    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
                    End Function
                    Const WM_APPCOMMAND As UInteger = &H319
                    Const APPCOMMAND_VOLUME_UP As UInteger = &HA
                    Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9
                    Const APPCOMMAND_VOLUME_MUTE As UInteger = &H8
                    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
                        Button1.Text = "Monter"
                        Button2.Text = "Baisser"
                        Button3.Text = "Muet"
                    End Sub
                    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
                        SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))
                    End Sub
                    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
                        SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr))
                    End Sub
                    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
                        SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H200EB0, IntPtr), CType(APPCOMMAND_VOLUME_MUTE * &H10000, IntPtr))
                    End Sub
                End Class
                


                Tu cliques sur Muet un seconde fois pour remettre le son. à toi de l'adapter dans ton projet.
                0
                1. Bonjour,
                  as-tu tester ce code ?
                  parce que moi lorsque je me les lignes
                  Option Strict On
                  Imports System.Runtime.InteropServices

                  il souligne tous les élements de ma form1 et si je ne les met pas il souligne les lignes
                  <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
                  End Function

                  et dans tous les cas il ne peut pas compiler
                  0
              2. Contributeur
                Non je ne vois pas, édite un nouveau post tu auras plus de réponses !
                0
                1. Bonjour,
                  Encore une chose : peut on, soit allumer automatiquement le son du pc, soit vérifier si le son du pc est allumé ?
                  0
                  1. Contributeur
                    Oui c'est possible:

                    Form1
                       My.Computer.Audio.Play("C:\Windows\Media\Alarm01.wav", AudioPlayMode.BackgroundLoop) 'joue en boucle
                            Form2.ShowDialog()


                    Form2
                       'Arrete la lecture du son
                            My.Computer.Audio.Stop()
                            Me.Hide()

                    1
                    1. C'est exactement ce que je voulais, merci beaucoup !
                      0
                  2. Bonjour,
                    j'aimerais te demander une aide supplémentaire pour mon projet :
                    ton idée de rajouté une sonnerie m'a intéresser et je vais donc en mettre une en plus du message. j'aimerais pouvoir avoir le message ouvert en meme temps qu'il y a la sonnerie et que si on ferme le message avant que la sonnerie soit terminer alors on éteint la sonnerie au milieu. Est-ce possible ?
                    0
                    1. Ta méthode avec la form2 marche parfaitement !!! merci infiniment !
                      Je n'ai plus qu'a adapté la fenêtre comme je veux.

                      Pour le son j'ai essayer de mettre la sonnerie "Windows - Alarme batterie.wav" mais il plante et dit qu'il ne trouve pas le fichier alors qu'avec "Alarm01.wav", tout se passe bien !
                      peut-être qu'il ne peut pas lire les fichiers dont le nom contient des espaces...

                      Encore merci !
                      0
                      1. Contributeur
                        Pour le son, essaie les fichiers commençant par Windows - comme ceci:

                        Windows - Alarme batterie

                        Voir si ils fonctionnent sans le son
                        0
                        1. Contributeur
                          Je m'en doutais!

                          Dans l'immédiat je te propose une 2 ème solution:

                          Faire ton MsgBox perso avec un form

                          Tu vas dans projet- Ajouter un Formulaire Windows.
                          Normalement il va se nommer Form2, sinon tu adaptes

                          Dans le form1 à la place de l'appel de ton MsgBox tu mets ceci:

                            Form2.ShowDialog()


                          Et dans ton Form2 tu ajoute un Label et un button avec ce code:

                          Public Class Form2
                              Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
                                  Me.Hide()
                              End Sub
                              Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
                                  Me.Text = "MsgBox perso"
                                  Label1.Text = "Ceci est un message" & Environment.NewLine & "c'est la 2ème ligne" & Environment.NewLine & "c'est la 3ème ligne"
                                  Label1.AutoSize = True
                                  TopMost = True 'Formulaire s'affiche au dessus des autres
                                  ControlBox = False
                                  Button1.Text = "Fermer"
                              End Sub
                          End Class


                          Voilà, bonne programmation
                          0
                          1. Contributeur
                            Voila un exemple

                                 MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)


                            tu mets un point derrière MessageBoxIcon. et tu auras un menu contextuel avec les autres options
                            0
                            1. Merci,
                              j'ai pu tester mais malheureusement ça ne marche pas.
                              sinon connais-tu un fonction permettant d'allumer le son de l'ordinateur ou de jouer la sonnerie même si le son est éteint ? (certaines applications le font)
                              0
                          2. Bonjour et merci de vos réponses,
                            pour répondre à cs_Le Pivert, en effet ta méthode marche et c'est donc celle que je vais utiliser si je ne trouve pas d'autre solution mais le problème est que je n'ai toujours le son de mon pc allumé :) (à moins qu'il existe une commande pour allumer automatique le son)

                            pour répondre à MrWhitediamond, cela ne résous pas mon problème car tu as fais comme mon code mais en changent le bouton OK en boutons oui et non mais cela n'affiche toujours pas la fenetre en premier plan. par contre tu as parler de s'afficher en critical, je ne sais pas ce que tu voulais dire par la mais cela m'as rappeler qu'il y a un paramètre permettant d'afficher la fenêtre avec un point d'exclamation comme si il y avais une erreur ce qui a peut-être pour effet de l'afficher au premier plan. je n'ai pas pu tester car je ne me rappelle plus de ce paramètre donc si quelqu'un le connait, je pourrais essayer.

                            merci encore de chercher à résoudre mon problème.
                            0
                            1. Pour créer un MsgBox au premier plan tu dois utiliser une des values suivantes :

                              16 --> OK
                              17 --> OK + CANCEL
                              18 --> ABORT + RETRY + IGNORE
                              19 --> YES + NO + CANCEL
                              20 --> YES + NO
                              21 --> RETRY + CANCEL

                              La fenêtre s'affichera en CRITICAL, ce qui signifie en 1re plan mais aussi avec le son windows.

                              Exemple de code en vbscript :

                              x= MsgBox ("Le Texte de la fenêtre",20,"Le Titre de la fenêtre")
                              if x = 6 then //si l'utilisateur clique sur OUI
                              .....
                              elseif x = 7 then
                              .....
                              end if
                              0
                              1. Contributeur
                                Bonjour,

                                Pourquoi ne pas jouer un son à la place d'un MsgBox, comme ceci:

                                   My.Computer.Audio.Play("C:\Windows\Media\Alarm01.wav", AudioPlayMode.WaitToComplete) 'joue complétement, ne s'arrête qu'à la fin du morceau


                                le chemin du fichier wave est pour Windows 8.1, a vérifier sur le pc
                                0