2018年7月15日 星期日

[C# WinForm] Windows Media Player功能應用

工具: VisualStudio2010

電腦內建的Windows Media Player一直是年久不衰的播放軟體,
廢話不多說,簡單說明一下如何在Windows Form裡面加入Windows Media Player元件

Step1: 從工具箱 選擇項目


Step2: COM元件 -> Windows Media Player

Step3: 接下來我們可以從工具箱中找到這個Windows Media Player元件,將它拖曳到專案內
就可以開始使用。我們可以看到在右邊綠色框框中,自動產生了AxInterop.WMPLib與Interop.WMPLib元件



基本上這樣就算完成
我們可以透過下面簡單的指令,讓這個Player可以開始播放音樂:
            this.axWindowsMediaPlayer1.URL = string.Format(@"C:\Users\Jerry\Desktop\What is love.mp3");

我們也可以透過ListBox點了之後,就開始播放,像我就習慣把我喜歡的歌放在一個資料夾內
這裡是用E:\mmusic\ 資料夾

listBox5點選切換事件
        private void listBox5_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.axWindowsMediaPlayer1.URL = string.Format(@"E:\mmusic\" + listBox5.SelectedItem);
        }


進入點:
        private void Form1_Load(object sender, EventArgs e)
        {
            MusicPlayer_initial();
        }

狀態用途,後面會再提到
        private void MusicPlayer_initial()
        {
            MusicFolderRefresh();
            axWindowsMediaPlayer1.PlayStateChange += player_PlayStateChange;
        }

目錄內所有mp3檔案倒進listBox5
        public void MusicFolderRefresh()
        {
            listBox5.Items.Clear();
            string[] tempMusicFile;
            string path = @"E:\mmusic\";
            //tempMusicFile = Directory.GetDirectories(path);
            tempMusicFile = Directory.GetFiles(path, "*.mp3");
 
            foreach (string iii in tempMusicFile)
            {
                listBox5.Items.Add(Path.GetFileName(iii));
            }
        }

顯示畫面:

重複與隨機功能:

在介紹這個功能之前,要先說明下工作狀態
WMPLibrary裡面有播放器的狀態,從字面上可以看出他的各種意思

wmppsUndefinedWindows Media Player is in an undefined state.
wmppsStoppedPlayback is stopped.
wmppsPausedPlayback is paused.
wmppsPlayingStream is playing.
wmppsScanForwardStream is scanning forward.
wmppsScanReverseStream is scanning backward.
wmppsBufferingStream is being buffered.
wmppsWaitingWaiting for streaming data.
wmppsMediaEndedThe end of the media item has been reached.
wmppsTransitioningPreparing new media item.
wmppsReadyReady to begin playing.
wmppsReconnectingTrying to reconnect for streaming data.
wmppsLastLast enumerated value. Not a valid state.


資料來源:
https://docs.microsoft.com/zh-tw/windows/desktop/api/wmp/ne-wmp-wmpplaystate

這裡目前只會使用到wmppsStopped,因為我們的目的是重複播放與隨機播放,所以我們只看結束的那一刻.....

隨機播放:
利用Random產生1~list內項目的數,並透過listBox5.SetSelected(i, true); 使ListBox自動再觸發其他項目來達到隨機循環。


        private void player_PlayStateChange(object sender, 
AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            try
            {
                if (axWindowsMediaPlayer1.playState == 
WMPLib.WMPPlayState.wmppsStopped)
                {
                    if (cbx_RepeatMusic.Checked)
                    {
                        if (cbx_RandomMusic.Checked)
                        {
                            Random rnd = new Random(Guid.NewGuid().GetHashCode());
                            int i = rnd.Next(1, listBox5.Items.Count);
                            listBox5.SetSelected(i, true);
                        }
                        else
                        {
                            axWindowsMediaPlayer1.Ctlcontrols.play();
                        }
                    }
                }
            }
            catch (Exception exx)
            {
                MessageBox.Show(exx.Message + exx.StackTrace);
            }
        }

之前用到的狀態事件用途,可以讓播放器透過簡單的事件來回傳狀態:

_WMPOCXEvents_PlayStateChangeEvent

當Repeat選了之後觸發play,讓Player再播放一次
axWindowsMediaPlayer1.Ctlcontrols.play();

除了Play() //執行
還有其他功能
fastForward(); //向前快轉
fastReverse(); //反向快轉

先這樣,後續會再整理這篇....
Source code之後會更新到GitHub 等我摸熟再整理囉XDD

可能的延伸應用:

1. 針對音樂自訂播放大小聲,比如說哪首歌音量為80,其他為100,就可以防止爆音傷害耳朵XDD