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#