Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Interfacciarsi con Windows Media Player tramite C#

Sto facendo esperimenti con C# per l'interfacciamento con WMP per cercare di capire come ottenere informazioni sul file che si sta playando. Non è affatto complicato, anzi, come al solito è molto divertente.

Bisogna innanzitutto aggiungere nei references il file wmp.dll, parte integrante di WMP. A questo punto abbiamo a disposizione tutto l'object model con cui possiamo veramente fare di tutto: fare il play di un file, enumerare le playlist, crearne di nuove, controllare il lettore con i semplici play/stop/pause, skinnare l'applicativo e via dicendo.

Ad esempio, se volessimo sapere quante playlist sono state definite...

player = new WMPLib.WindowsMediaPlayer();

WMPLib.IWMPPlaylist lista;
WMPLib.IWMPPlaylistCollection coll = player.playlistCollection;
WMPLib.IWMPPlaylistArray arr = coll.getAll();
int howmany = arr.count;

for(int i=0;i<howmany;i++)
{
    lista = arr.Item(i);
    Debug.WriteLine(lista.name + " : " + lista.count);
}

Dichiaro un oggetto WindowsMediaPlayer, ottengo un oggetto IWMPPlaylistCollection. Il metodo getAll() ritorna un IWMPPlaylistArray che contiene appunto tutte le playlist. Il ciclo for non fa altro che mostrare il nome di ciascuna playlist e quanti files contiene.

Dato un IWMPPlaylist, possiamo ottenere un'istanza di IWMPMedia, che punta ad un item specifico contenuto nella nostra playlist. Per esempio, il codice seguente....

WMPLib.IWMPMedia media = lista.get_Item(0);
Debug.WriteLine(media.sourceURL);
Debug.WriteLine(media.name);
Debug.WriteLine(media.durationString);

....crea un IWMPMedia prendendo il primo file di una certa playlist. Le property sourceURL, name e durationString ritornano, rispettivamente, path/url del file, titolo della canzone e durata in formato mm:ss. L'oggetto WindowsMediaPlayer dispone di una property controls tramite la quale accedere ai classici comandi play/stop/pause/rewind, oltre che diversi current* per ottenere info sul file multimediale corrente (ritornando un'istanza di IWMPMedia).

Utili anche gli eventi sollevati, che permettono, tra le altre cose, di capire quando c'è un cambiamento del file corrente.

Di default, l'istanza del nostro Windows Media Player gira "nascosta". Possiamo renderla visibile a tutti gli effetti agendo su property come fullscreen, openState, playerApplication, settings, stretchToFit e windowlessVideo, tutte esposte dalla classe WindowsMediaPlayer.

Cosa mi preoccupa?
Come magari qualcuno di voi ha intuito, mi sono messo ad esplorare velocemente l'object model di WMP nel tentativo di creare una classe da utilizzare con HappySign. C'è una cosa che mi preoccupa: via C# possiamo controllare un'istanza di WMP creata da noi stessi programmaticamente (via codice), ma non sono ancora riuscito ad agganciarmi ad un'istanza già creata dall'utente per poterne assumere - almeno parzialmente - il controllo. Questo è essenziale perchè l'utente apre WMP, ascolta quello che vuole per un po', poi apre HappySign per decorare una firma. Il codice .NET deve rilevare l'istanza aperta, ottenere un'istanza di IWMPMedia e formattarla come string

Ho sfogliato MSDN alla ricerca di qualche info utile. Googlando qualche link l'ho trovato, ma fanno tutti riferimento ad un WMP creato da zero. Ho pensato che Messenger ha questa funzionalità: visualizza la musica in ascolto, fa proprio quello che voglio fare io. Ho aperto Spy++ per esaminare i messaggi, ho cercato nel registry. Ho usato la FindWindow per ottenere l'handle della finestra di Windows Media Player: tutto ok, ma come posso poi ottenere un'istanza della classe WindowsMediaPlayer? Alla fine, ho trovato un thread su microsoft.public.windowsmedia.sdk che pare confermare che bisogna accederci tramite C++ e un bel pesante Interop.

La missione continua...

Qualche link utile:
Embedding the Windows Media Player Control
Creating the Windows Media Player Control Programmatically
"get opened instance Windows Media Player C#" su google.com
Google Groups results for get running instance Windows Media Player C#

powered by IMHO 1.2

Print | posted on venerdì 11 novembre 2005 17:26 | Filed Under [ I miei freeware Sviluppo .NET ]

Feedback

Gravatar

# re: Interfacciarsi con Windows Media Player tramite C#

si ma WMP e' microsoft, non dirmi che non ci hanno pensato a COM/.NEt ;)
11/11/2005 18:38 | Zio
Gravatar

# re: Interfacciarsi con Windows Media Player tramite C#

Zio:
occhio che tutto questo discorso si applica se vuoi "agganciarti" ad un WMP già lanciato. Da .NET hai pieno potere su WMP, se crei tu l'istanza: puoi fare assolutamente di tutto...quindi non è del tutto esatto che WMP non dialoga tramite COM.

Igor giustamente ha segnalato WMP plug-in perchè probabilmente con qualche componente unmanaged riesce a rilevare un eventuale WMP esistente. E' lo stesso plug-in che usa IMHO.
11/11/2005 18:57 | Igor Damiani
Gravatar

# re: Interfacciarsi con Windows Media Player tramite C#

non riesco a far partire media play
09/03/2006 22:21 | erikus
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET