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

C# Discussion :

Winamp: Récupérer le chemin complet du fichier lu ?


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut Winamp: Récupérer le chemin complet du fichier lu ?
    Bonjour,

    Presque tout est dans le titre:
    Je travaille sur une application qui communique avec Winamp pour savoir ce qu'il fait.
    J'utilise pour l'instant WinampProxy (Infos ICI)qui permet d'interfacer les appels win32 pour .Net, mais je suis disposé à changer pour atteindre mon but:
    => Obtenir le chemin complet du fichier lu !

    J'arrive à détecter quand Winamp se lance, s'arrete, change de chanson et tout, mais rien pour récupérer le nom complet du fichier...

    Est-ce que quelqu'un a déjà fait ça ?

    Merci d'avance pour toute piste !
    ElTchoupi

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Apparemment y a une méthode GetTrackFilename...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    Merci pour la réponse rapide !

    Oui, en effet, la méthode existe, mais elle fait appel à une méthode GetPlayList qui utilise un ancien call Win32: IPC_WRITEPLAYLIST
    CElui-ci est cencé demander à Winamp d'écrire toute la playlist dans un fichier "winamp.m3u" dans le repertoire d'installation; malheureusement, quand je passe dans la méthode qui fait cet appel, aucun fichier n'est créé

    J'avoue que je ne sais pas comment vérifier que le message est bien envoyé...
    ElTchoupi

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    OK, je devine ce qui ne va pas... tu es sous Vista, non ? Dans ce cas, un programme qui ne tourne pas en tant qu'admin ne peut pas écrire dans le répertoire des programmes (program files), et la fonction GetPlayList utilise apparemment ce répertoire. Il suffirait de modifier le code de cette fonction pour utiliser à la place le répertoire temporaire.

    Remplace ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          // set path to temp directory
          string strModuleName = GetAppNameFromHwnd(hwnd);
          string strPath = System.IO.Path.GetDirectoryName(strModuleName);
          SendWindowsStringMessage(hwnd, IPC_CHDIR, 0, strPath + "\0");
          // check and see if file already exists; if so, rename it
          string strPlaylistName = strPath + System.IO.Path.DirectorySeparatorChar + "Winamp.m3u";
    Par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          // set path to temp directory
          string strPath = System.IO.GetTempPath();
          SendWindowsStringMessage(hwnd, IPC_CHDIR, 0, strPath + "\0");
          // check and see if file already exists; if so, rename it
          string strPlaylistName = System.IO.Combine(PathstrPath, "Winamp.m3u");
    Si le problème est bien celui que je pense, ça devrait marcher...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    Nope: j'ai testé mon soft sur 3 machines sous XP

    Mais (encore) merci de m'aider !
    ElTchoupi

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    En fait, c'est Winamp qui devrait écrire ce fichier quand on lui envoie le message en question...
    Mais dans le repertoire de Winamp, aucune trace du-dit fichier
    ElTchoupi

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    oui mais si tu regardes bien le code, le fichier généré dans le répertoire de Winamp est aussitôt déplacé vers un fichier temporaire, donc c'est normal que tu ne vois pas le fichier dans le repertoire de Winamp...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    ARG, le boulet !

    Bon, je rouvre la solution et je regarde tout de suite, merci pour cette piste !
    ElTchoupi

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    mais de toutes façons, pourquoi tu t'intéresses à ce fichier ? il te sert à rien, tout ce que tu as besoin de récupérer c'est le résultat de la fonction GetTrackFilename... le fichier est juste utilisé en interne

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    Bon, après verif, dans le WinampInterface.cs, méthode "public static List<Track> GetPlaylist()"
    il passe bien à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // write out the list
    SendMessage(hwnd, WM_WA_IPC, WA_NOTHING, IPC_WRITEPLAYLIST);
    // check to see if it exists
    if (System.IO.File.Exists(strPlaylistName) == false)
       return null;
    'strPlaylistName' vallant chez moi "C:\Program Files\Winamp\Winamp.m3u".
    en faisant du pas-à-pas, il passe dans le SendMessage mais rien n'apparait dans le repertoire de Winamp

    ... Du coup il sort direct de la méthode à la ligne du dessous

    Any other idea ?
    ElTchoupi

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    bon, j'ai testé et effectivement ça marche pas non plus chez moi... peut-être que ça marchait avec la version 3, mais en tous cas avec la 5 ça marche pas : le fichier playlist est écrit dans "C:\Documents And Settings\utilisateur\Application Data\Winamp", et pas dans le répertoire de l'application (sans doute pour assurer la compatibilité avec Vista). Et visiblement la commande IPC_CHDIR n'a aucun effet là dessus.

    En remplaçant le bloc de code que j'ai cité plus haut par celui-ci, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // set path to temp directory
    string strPlaylistName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Winamp\winamp.m3u");
    Ou encore mieux, pour gérer toutes les versions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
          // set path to temp directory
          string strPlaylistName;
          if (GetWinampVersion() >= 5.0)
          {
              strPlaylistName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Winamp\winamp.m3u");
          }
          else
          {
              string strModuleName = GetAppNameFromHwnd(hwnd);
              string strPath = System.IO.Path.GetDirectoryName(strModuleName);
              SendWindowsStringMessage(hwnd, IPC_CHDIR, 0, strPath + "\0");
              // check and see if file already exists; if so, rename it
              strPlaylistName = strPath + System.IO.Path.DirectorySeparatorChar + "Winamp.m3u";
          }
    (en supposant que ce soit bien la version 5.0 qui introduit ce changement...)

    EDIT: en fait l'astuce avec GetWinampVersion ne passe pas, pour la version 5.551, ça renvoie 2.055 Vraiment foireux ce truc...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    HHHAAAAAAA

    TOMLEV, YOU SAVED MY LIFE !!

    Bon, d'accord, je suis un boulet, j'aurais pu me douter d'un truc comme ça et chercher dans AppData (Quoi que...).

    (J'ai pas encore touché à mon code, mais trouver le fichier où tu l'indiques vient de changer l'orientation de ma journée...déjà bien engagée, je le reconnais !)

    MERCI !!
    ElTchoupi

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Pour l'histoire de la version, voilà une astuce pour obtenir la "vraie" version :
    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
     
        public static Version GetRealWinampVersion()
        {
            IntPtr hwnd = FindWindow(m_windowName, null);
            string strModuleName = GetAppNameFromHwnd(hwnd);
            FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(strModuleName);
            Version version = new Version(verInfo.ProductVersion);
            return version;
        }
     
     
    ...
     
          // set path to temp directory
          string strPlaylistName;
          if (GetRealWinampVersion().Major >= 5)
          {
              strPlaylistName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Winamp\winamp.m3u");
          }
          else
          {
              string strModuleName = GetAppNameFromHwnd(hwnd);
              string strPath = System.IO.Path.GetDirectoryName(strModuleName);
              SendWindowsStringMessage(hwnd, IPC_CHDIR, 0, strPath + "\0");
              strPlaylistName = strPath + System.IO.Path.DirectorySeparatorChar + "Winamp.m3u";
          }

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Points : 109
    Points
    109
    Par défaut
    Merci, je vais appliquer tout de suite !

    Je vais probabalement proposer à David Stein, le developpeur de ces outils, de les corriger (voir améliorer) pour republier une lib un peu plus clean et fonctionnelle.

    Si je le fais (ça sera pas tout de suite, mais bon), tu m'autorise à utiliser ton code dans la nouvelle version ? Tu serais évidemment cité dans les sources et Readme...

    Merci encore pour ton aide !
    ElTchoupi

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ElTchoupi Voir le message
    Si je le fais (ça sera pas tout de suite, mais bon), tu m'autorise à utiliser ton code dans la nouvelle version ? Tu serais évidemment cité dans les sources et Readme...
    Ah non, j'ai déjà déposé le brevet et tout ça
    Je plaisante, bien sûr que tu peux utiliser mon code

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/05/2017, 10h01
  2. Souris - Récupérer le chemin complet d'un fichier
    Par CLion dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2009, 20h56
  3. Réponses: 2
    Dernier message: 04/08/2007, 21h58
  4. récupérer le chemin complet d'un fichier
    Par Mounr dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2007, 14h20
  5. Réponses: 13
    Dernier message: 10/04/2006, 17h25

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