// Copyright (c) Microsoft Corporation. All rights reserved. /* This sample application shows how to use the Windows Media Player control in * Windows Forms. The control has been placed on Form1 from the Toolbox. * * Functionality demonstrated includes: * -- using Player controls such as play, pause, stop, fastForward, fastReverse and currentPosition. * -- getting properties for a media item, such as name, duration, and sourceURL. * -- handling events from the Player, including error events. * -- retrieving media items from the Library. * * Note about catching COMExceptions: In C++, calls to Windows Media Player SDK methods return HRESULTs. When a method * returns a failed HRESULT, C++ code should check the value and respond accordingly. When using COM interop to call * Windows Media Player SDK methods, failed HRESULTs are raised as COMExceptions. This sample code simply wraps each call * to Windows Media Player in a try block and then displays an error message when a COMException is raised. * For your own code, you should make decisions about how to handle such error conditions. * * Note about localization: This sample uses strings that assume the user is in the "en-US" culture. */ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; using AxWMPLib; using WMPLib; namespace WMPCSharp { /// /// Summary description for Form1. /// public class Form1 : System.Windows.Forms.Form { private AxWMPLib.AxWindowsMediaPlayer Player; private System.Windows.Forms.Button btnPlayPause; private System.Windows.Forms.Button btnStop; private System.Windows.Forms.Button btnOpen; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label lblSongName; private System.Windows.Forms.Label lblOpenState; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label lblPlayState; private System.Windows.Forms.TrackBar tbSeek; private System.Windows.Forms.Timer tmrPos; private System.Windows.Forms.Label lblSourceURL; private System.Windows.Forms.Label lblTime; private System.Windows.Forms.Button btnFF; private System.Windows.Forms.Button btnRew; private System.Windows.Forms.Label label4; private System.ComponentModel.IContainer components; public Form1() { InitializeComponent(); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1)); this.Player = new AxWMPLib.AxWindowsMediaPlayer(); this.btnPlayPause = new System.Windows.Forms.Button(); this.btnStop = new System.Windows.Forms.Button(); this.btnOpen = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.lblSongName = new System.Windows.Forms.Label(); this.lblOpenState = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.lblPlayState = new System.Windows.Forms.Label(); this.tbSeek = new System.Windows.Forms.TrackBar(); this.tmrPos = new System.Windows.Forms.Timer(this.components); this.lblSourceURL = new System.Windows.Forms.Label(); this.lblTime = new System.Windows.Forms.Label(); this.btnFF = new System.Windows.Forms.Button(); this.btnRew = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.Player)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.tbSeek)).BeginInit(); this.SuspendLayout(); // // Player // this.Player.Enabled = true; this.Player.Location = new System.Drawing.Point(24, 8); this.Player.Name = "Player"; this.Player.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("Player.OcxState"))); this.Player.Size = new System.Drawing.Size(192, 152); this.Player.TabIndex = 0; this.Player.TabStop = false; this.Player.PlayStateChange += new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(this.Player_PlayStateChange); this.Player.OpenStateChange += new AxWMPLib._WMPOCXEvents_OpenStateChangeEventHandler(this.Player_OpenStateChange); this.Player.MediaError += new AxWMPLib._WMPOCXEvents_MediaErrorEventHandler(this.Player_MediaError); // // btnPlayPause // this.btnPlayPause.Enabled = false; this.btnPlayPause.Location = new System.Drawing.Point(24, 176); this.btnPlayPause.Name = "btnPlayPause"; this.btnPlayPause.Size = new System.Drawing.Size(48, 23); this.btnPlayPause.TabIndex = 1; this.btnPlayPause.Text = "&Play"; this.btnPlayPause.Click += new System.EventHandler(this.btnPlayPause_Click); // // btnStop // this.btnStop.Enabled = false; this.btnStop.Location = new System.Drawing.Point(72, 176); this.btnStop.Name = "btnStop"; this.btnStop.Size = new System.Drawing.Size(48, 23); this.btnStop.TabIndex = 2; this.btnStop.Text = "&Stop"; this.btnStop.Click += new System.EventHandler(this.btnStop_Click); // // btnOpen // this.btnOpen.Location = new System.Drawing.Point(416, 128); this.btnOpen.Name = "btnOpen"; this.btnOpen.TabIndex = 0; this.btnOpen.Text = "&Open..."; this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click); // // label1 // this.label1.Location = new System.Drawing.Point(232, 16); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(40, 24); this.label1.TabIndex = 6; this.label1.Text = "Song:"; // // lblSongName // this.lblSongName.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.lblSongName.Location = new System.Drawing.Point(272, 16); this.lblSongName.Name = "lblSongName"; this.lblSongName.Size = new System.Drawing.Size(224, 16); this.lblSongName.TabIndex = 7; // // lblOpenState // this.lblOpenState.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.lblOpenState.Location = new System.Drawing.Point(312, 176); this.lblOpenState.Name = "lblOpenState"; this.lblOpenState.Size = new System.Drawing.Size(192, 23); this.lblOpenState.TabIndex = 11; // // label2 // this.label2.Location = new System.Drawing.Point(248, 176); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(64, 16); this.label2.TabIndex = 10; this.label2.Text = "OpenState:"; // // label3 // this.label3.Location = new System.Drawing.Point(248, 200); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(64, 23); this.label3.TabIndex = 12; this.label3.Text = "Play State:"; // // lblPlayState // this.lblPlayState.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.lblPlayState.Location = new System.Drawing.Point(312, 200); this.lblPlayState.Name = "lblPlayState"; this.lblPlayState.Size = new System.Drawing.Size(192, 23); this.lblPlayState.TabIndex = 13; // // tbSeek // this.tbSeek.Enabled = false; this.tbSeek.Location = new System.Drawing.Point(8, 208); this.tbSeek.Maximum = 100; this.tbSeek.Name = "tbSeek"; this.tbSeek.Size = new System.Drawing.Size(224, 45); this.tbSeek.TabIndex = 5; this.tbSeek.TickFrequency = 0; this.tbSeek.TickStyle = System.Windows.Forms.TickStyle.None; this.tbSeek.Scroll += new System.EventHandler(this.tbSeek_Scroll); // // tmrPos // this.tmrPos.Interval = 250; this.tmrPos.Tick += new System.EventHandler(this.tmrPos_Tick); // // lblSourceURL // this.lblSourceURL.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.lblSourceURL.Location = new System.Drawing.Point(272, 48); this.lblSourceURL.Name = "lblSourceURL"; this.lblSourceURL.Size = new System.Drawing.Size(224, 64); this.lblSourceURL.TabIndex = 9; // // lblTime // this.lblTime.Location = new System.Drawing.Point(72, 256); this.lblTime.Name = "lblTime"; this.lblTime.Size = new System.Drawing.Size(96, 16); this.lblTime.TabIndex = 12; this.lblTime.Text = "00:00"; this.lblTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // btnFF // this.btnFF.Enabled = false; this.btnFF.Location = new System.Drawing.Point(168, 176); this.btnFF.Name = "btnFF"; this.btnFF.Size = new System.Drawing.Size(48, 23); this.btnFF.TabIndex = 4; this.btnFF.Text = ">>"; this.btnFF.Click += new System.EventHandler(this.btnFF_Click); // // btnRew // this.btnRew.Enabled = false; this.btnRew.Location = new System.Drawing.Point(120, 176); this.btnRew.Name = "btnRew"; this.btnRew.Size = new System.Drawing.Size(48, 23); this.btnRew.TabIndex = 3; this.btnRew.Text = "<<"; this.btnRew.Click += new System.EventHandler(this.btnRew_Click); // // label4 // this.label4.Location = new System.Drawing.Point(232, 48); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(32, 23); this.label4.TabIndex = 8; this.label4.Text = "URL:"; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(520, 278); this.Controls.Add(this.label4); this.Controls.Add(this.btnRew); this.Controls.Add(this.btnFF); this.Controls.Add(this.lblTime); this.Controls.Add(this.lblSourceURL); this.Controls.Add(this.tbSeek); this.Controls.Add(this.lblPlayState); this.Controls.Add(this.label3); this.Controls.Add(this.label2); this.Controls.Add(this.lblOpenState); this.Controls.Add(this.lblSongName); this.Controls.Add(this.label1); this.Controls.Add(this.btnOpen); this.Controls.Add(this.btnStop); this.Controls.Add(this.btnPlayPause); this.Controls.Add(this.Player); this.MaximizeBox = false; this.Name = "Form1"; this.Text = "C# Windows Media Player Sample"; ((System.ComponentModel.ISupportInitialize)(this.Player)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.tbSeek)).EndInit(); this.ResumeLayout(false); } #endregion /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.Run(new Form1()); } IWMPMedia theMedia = null; // Represents the current media to set. /// /// Centralize UI state control. /// /// State of the player private void SetUIState(WMPPlayState newState) { bool canFF, canRew, canPlay, canPause, canSeek, canStop; double fDuration; try { canFF = Player.Ctlcontrols.get_isAvailable("fastForward"); canRew = Player.Ctlcontrols.get_isAvailable("fastReverse"); canPlay = Player.Ctlcontrols.get_isAvailable("Play"); canPause = Player.Ctlcontrols.get_isAvailable("Pause"); canSeek = Player.Ctlcontrols.get_isAvailable("currentPosition"); canStop = Player.Ctlcontrols.get_isAvailable("Stop"); fDuration = Player.currentMedia.duration; } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); return; } switch (newState) { case WMPPlayState.wmppsStopped: btnStop.Enabled = canStop; btnPlayPause.Enabled = canPlay; btnPlayPause.Text = "&Play"; btnFF.Enabled = canFF; btnRew.Enabled = canRew; tmrPos.Stop(); tbSeek.Value = 0; lblTime.Text = "00:00"; if(canSeek) { tbSeek.Enabled = true; } break; case WMPPlayState.wmppsPlaying: btnStop.Enabled = canStop; btnPlayPause.Enabled = canPause; btnPlayPause.Text = "&Pause"; btnFF.Enabled = canFF; btnRew.Enabled = canRew; if(canSeek) { tbSeek.Enabled = true; } if(fDuration > 0) { tmrPos.Start(); } break; case WMPPlayState.wmppsPaused: btnStop.Enabled = canStop; btnPlayPause.Enabled = canPlay; btnPlayPause.Text = "&Play"; btnFF.Enabled = canFF; btnRew.Enabled = canRew; tmrPos.Stop(); if(canSeek) { tbSeek.Enabled = true; } break; case WMPPlayState.wmppsReady: btnStop.Enabled = false; btnPlayPause.Enabled = false; btnPlayPause.Text = "&Play"; btnFF.Enabled = false; btnRew.Enabled = false; tmrPos.Stop(); tbSeek.Value = 0; tbSeek.Enabled = false; lblTime.Text = "00:00"; break; case WMPPlayState.wmppsScanForward: case WMPPlayState.wmppsScanReverse: btnStop.Enabled = canStop; btnPlayPause.Enabled = canPause; btnPlayPause.Text = "&Play"; btnRew.Enabled = false; btnFF.Enabled = false; if(canSeek) { tbSeek.Enabled = true; } if(fDuration > 0) { tmrPos.Start(); } break; default: btnStop.Enabled = canStop; btnPlayPause.Enabled = canPlay; btnPlayPause.Text = "&Play"; btnFF.Enabled = canFF; btnRew.Enabled = canRew; tbSeek.Enabled = canSeek; if(fDuration > 0) { tmrPos.Start(); } else { tmrPos.Stop(); } break; } } #region UI Element Events /// /// Open new audio from the Library. /// private void btnOpen_Click(object sender, System.EventArgs e) { Library libForm = new Library(); libForm.WMPlayer = Player; libForm.ShowDialog(); if (libForm.DialogResult == DialogResult.OK) { try { theMedia = libForm.TheMedia; if(theMedia != null) // Test whether the user chose a media item. { lblSongName.Text = theMedia.name; lblSourceURL.Text = theMedia.sourceURL; // Set the current media. It will play automatically. Player.currentMedia = theMedia; } } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } } /// /// Play/Pause transport control button handler. /// private void btnPlayPause_Click(object sender, System.EventArgs e) { try { if(Player.playState == WMPPlayState.wmppsPlaying) { Player.Ctlcontrols.pause(); } else { Player.Ctlcontrols.play(); } } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } /// /// Stop button transport control. /// private void btnStop_Click(object sender, System.EventArgs e) { try { Player.Ctlcontrols.stop(); } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } /// /// Rewind button transport control. /// private void btnRew_Click(object sender, System.EventArgs e) { try { Player.Ctlcontrols.fastReverse(); } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } /// /// Fast-forward button transport control. /// private void btnFF_Click(object sender, System.EventArgs e) { try { Player.Ctlcontrols.fastForward(); } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } /// /// The user moved the trackbar. Set the new position. /// The trackbar has a fixed resolution of 100 ticks. /// This code maps that resolution to the file duration. /// private void tbSeek_Scroll(object sender, System.EventArgs e) { try { if(Player.currentMedia.duration != 0) { double newPerc = Convert.ToDouble(tbSeek.Value) / 100; int duration = Convert.ToInt32(Player.currentMedia.duration * 1000); // milliseconds double newPos = (duration * newPerc)/1000; // seconds // Seek the Player Player.Ctlcontrols.currentPosition = newPos; } else { tbSeek.Value = 0; //No duration available. Just ground the slider. } } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } /// /// Update the UI based on current media position. /// The trackbar has a fixed resolution of 100 ticks. /// This code maps that resolution to the file duration. /// private void tmrPos_Tick(object sender, System.EventArgs e) { try { // Update the trackbar. int curPos = Convert.ToInt32(Player.Ctlcontrols.currentPosition * 1000); // milliseconds int duration = Convert.ToInt32(Player.currentMedia.duration * 1000); // milliseconds if(duration > 0) { tbSeek.Value = Convert.ToInt32((curPos * 100) / duration); // % complete } // Update the time label lblTime.Text = Player.Ctlcontrols.currentPositionString; } catch(COMException comExc) { int hr = comExc.ErrorCode; String Message = String.Format("There was an error.\nHRESULT = {1}\n{2}", hr.ToString(), comExc.Message); MessageBox.Show(Message, "COM Exception"); } } #endregion #region Windows Media Player Events /// /// Handle the Player.OpenStateChange event. /// private void Player_OpenStateChange(object sender, AxWMPLib._WMPOCXEvents_OpenStateChangeEvent e) { switch((WMPOpenState)e.newState) { case WMPOpenState.wmposBeginCodecAcquisition: lblOpenState.Text = "Beginning codec acquisition..."; break; case WMPOpenState.wmposBeginIndividualization: lblOpenState.Text = "Beginning individualization..."; break; case WMPOpenState.wmposBeginLicenseAcquisition: lblOpenState.Text = "Beginning license acquisition..."; break; case WMPOpenState.wmposMediaChanging: lblOpenState.Text = "Media changing..."; break; case WMPOpenState.wmposMediaConnecting: lblOpenState.Text = "Media connecting..."; break; case WMPOpenState.wmposMediaLoading: lblOpenState.Text = "Media loading..."; break; case WMPOpenState.wmposMediaLocating: lblOpenState.Text = "Media locating..."; break; case WMPOpenState.wmposMediaOpen: lblOpenState.Text = "Media open"; break; case WMPOpenState.wmposMediaWaiting: lblOpenState.Text = "Media waiting..."; break; case WMPOpenState.wmposOpeningUnknownURL: lblOpenState.Text = "Opening unknown URL..."; break; case WMPOpenState.wmposPlaylistChanged: lblOpenState.Text = "Playlist changed..."; break; case WMPOpenState.wmposPlaylistChanging: lblOpenState.Text = "Playlist changing..."; break; case WMPOpenState.wmposPlaylistConnecting: lblOpenState.Text = "Playlist connecting..."; break; case WMPOpenState.wmposPlaylistLoading: lblOpenState.Text = "Playlist loading..."; break; case WMPOpenState.wmposPlaylistLocating: lblOpenState.Text = "Playlist locating..."; break; case WMPOpenState.wmposPlaylistOpening: lblOpenState.Text = "Playlist opening..."; break; case WMPOpenState.wmposPlaylistOpenNoMedia: lblOpenState.Text = "Playlist open, no media"; break; default: lblOpenState.Text = ""; break; } } /// /// Handle the Player.PlayStateChange event. /// private void Player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) { WMPPlayState newState = (WMPPlayState)e.newState; switch(newState) { case WMPPlayState.wmppsBuffering: lblPlayState.Text = "Buffering..."; break; case WMPPlayState.wmppsMediaEnded: lblPlayState.Text = "Media ended"; SetUIState(newState); break; case WMPPlayState.wmppsPaused: lblPlayState.Text = "Paused"; SetUIState(newState); break; case WMPPlayState.wmppsPlaying: lblPlayState.Text = "Playing"; SetUIState(newState); break; case WMPPlayState.wmppsReady: lblPlayState.Text = "Ready"; SetUIState(newState); break; case WMPPlayState.wmppsReconnecting: lblPlayState.Text = "Reconnecting..."; break; case WMPPlayState.wmppsScanForward: lblPlayState.Text = "Scanning forward..."; SetUIState(newState); break; case WMPPlayState.wmppsScanReverse: lblPlayState.Text = "Scanning backwards..."; SetUIState(newState); break; case WMPPlayState.wmppsStopped: lblPlayState.Text = "Stopped"; SetUIState(newState); btnStop.Enabled = false; break; case WMPPlayState.wmppsTransitioning: lblPlayState.Text = "Transitioning..."; break; case WMPPlayState.wmppsWaiting: lblPlayState.Text = "Waiting..."; break; default: lblPlayState.Text = ""; break; } } /// /// Generic handler for Player error events. /// /// /// Information returned in the event arguments is limited to the media object /// that was the source of the error. Further information can be obtained from /// IWMPMedia2.Error. Use IWMErrorItem.Description with caution, because messages /// may be more relevant to the Windows Media Player than to your application. /// private void Player_MediaError(object sender, _WMPOCXEvents_MediaErrorEvent e) { IWMPMedia2 errSource = e.pMediaObject as IWMPMedia2; IWMPErrorItem errorItem = errSource.Error; String errorDesc = errorItem.errorDescription; String errorStr = "Error " + errorItem.errorCode.ToString("X") + " in " + errSource.sourceURL + "\n" + errorDesc; MessageBox.Show(errorStr, "Player Error"); } #endregion } }