Ouvrir un fichier avec son application

Résolu
wald39 Messages postés 68 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 23 février 2011 - 17 févr. 2007 à 14:12
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 24 févr. 2007 à 11:23
J'ai une application qui utilise le composant windows media player, j'ouvre un fichier avec mon appli tout marche nikel, mais lorsque j'en ouvre un autre sans quitter mon appli, qui est deja en train de lire l'autre fichier audio, sa me lance une deuxième fois mon application, du coup j'ai deux mon appli qui jou deux fichiers differents.

J'ouvre montre mon code qui recupère le fichier et le lit au lancement de l'appli :

string[] arg = Environment.GetCommandLineArgs();
            if (arg.Length > 0)
            {
                try
                {
                    if (arg[1] != "")
                    {
                        axWMP.URL = arg[1];    //axWMP est le composant windows media player
                    }
                }
                catch{}
            }

Est ce que quelqu'un a une solution?

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 févr. 2007 à 14:50
Salut, tu veux donc une seule instance de ton applucation c'est ça !?

mutex :
http://www.csharpfr.com/code.aspx?ID=11548

processus :
http://www.csharpfr.com/codes/EMPECHER-APPLIC-LANCER-FOIS_20698.aspx
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 févr. 2007 à 00:39
Une solution qu'on voit souvent sur le web c'est de passer par le .Net-remoting mais je ne suis pas trop fan du Net-remoting, l'autre soluce c'est d'envoyer un message à la première instance via l'API Win32. Si je trouve le temps j'essayerai de te donner un exemple.
3
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
17 févr. 2007 à 18:00
avec GetCommandLineArgs() on recupere le chemin complet vers le fichier (ex : c:\....\mavideo.avi)

if (Environment.GetCommandLineArgs().Length == 2)

                {

               
                }

++
0
wald39 Messages postés 68 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 23 février 2011 7
19 févr. 2007 à 12:03
Vos deux réponses sont bonnes mais comment je fais pour que mon application arrete de jouer le premier fichier et récupère le chemin de l'autre pour ensuite le jouer ?
0

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

Posez votre question
wald39 Messages postés 68 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 23 février 2011 7
20 févr. 2007 à 13:01
En tous cas merci, et un exemple m'aiderais bien !
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 févr. 2007 à 17:54
à tester..

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;


namespace Lutinore
{
    // Une seule instance de l'application, la ligne de commande est passée à l'instance active.
    // C'était également possible de faire ça avec un mutex nommé et le .NET remoting.
    // Le code unsafe peut être remplacé par des GCHandle pinned ou en copiant les données
    // dans le tas non managé avec Marshal.StringToHGlobalAuto, Marshal.StructureToPtr etc..
    internal class MainForm : Form
    {
        #region Win32


        [ StructLayout( LayoutKind.Sequential ) ]
        private struct COPYDATASTRUCT
        {
            public UIntPtr dwData;
            public uint cbData;
            public IntPtr lpData;
        }


        [ DllImport( "User32.dll" ) ]
        private static extern IntPtr SendMessage( IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam );


        private const int WM_COPYDATA = 0x004A;
        private const int CMDLINEARGS = 0x1001; // user value.


        #endregion // Win32


        private MainForm( ) : base( )
        {
            ProcessCommandLine( Environment.CommandLine );
        }


        protected override void WndProc( ref Message m )
        {
            if ( m.Msg == WM_COPYDATA )
            {
                unsafe // Compile with -unsafe.
                {
                    COPYDATASTRUCT* pDataStruct = ( COPYDATASTRUCT* )m.LParam;


                    if ( ( int )pDataStruct->dwData == CMDLINEARGS )
                    {
                        string cmdLine = new string( ( char* )pDataStruct->lpData );
                        ProcessCommandLine( cmdLine );
                        m.Result = ( IntPtr )1;
                        return;
                    }
                }
            }


            base.WndProc( ref m );
        }


        private void ProcessCommandLine( string cmdLine )
        {
            MessageBox.Show( cmdLine );
        }


        [ STAThread ]
        private static void Main( /* string[ ] args */ )
        {
            IntPtr hWnd = IntPtr.Zero;


            try
            {
                Process process = Process.GetCurrentProcess( );


                foreach( Process p in Process.GetProcessesByName( process.ProcessName ) )
                {                    if ( p.Id !process.Id && p.MainModule.FileName process.MainModule.FileName )
                    {
                        hWnd = p.MainWindowHandle;
                        break;
                    }
                }
            }
            catch
            {
                // ..
            }


            if ( hWnd != IntPtr.Zero )
            {
                string cmdLine = Environment.CommandLine + '\0';
                COPYDATASTRUCT dataStruct = new COPYDATASTRUCT( );


                unsafe // Compile with -unsafe.
                {
                    fixed ( char* pCmdLine = cmdLine )
                    {
                        COPYDATASTRUCT* pDataStruct = &dataStruct;
                        pDataStruct->dwData = ( UIntPtr )CMDLINEARGS;
                        pDataStruct->cbData = ( uint )cmdLine.Length * 2U; // Size in bytes.
                        pDataStruct->lpData = ( IntPtr )pCmdLine;


                        SendMessage( hWnd, WM_COPYDATA, UIntPtr.Zero, ( IntPtr )pDataStruct );
                    }
                }


                return; // Quitte cette instance de l'application.
            }


            // Lance l'unique instance de l'application.
            Application.EnableVisualStyles( );
            Application.SetCompatibleTextRenderingDefault( false );
            Application.Run( new MainForm( ) );
        }
    }
}
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
24 févr. 2007 à 11:23
salut,

par exemple : http://www.csharpfr.com/codes/OUVRIR-DOCUMENTS-DANS-MEME-INSTANCE-APPLICATION-SANS-RELANCEMENT_41097.aspx

il faut effectivement ensuite rajouter la gestion de Environment.CommandLine

ShareVB
0
Rejoignez-nous