2023年3月23日 星期四

[C# WinForm問題] Visual 2022 找不到'AxWMPLib.AxWindowsMediaPlayer'

 


錯誤畫面如下:




即使你的工具箱有辦法選到那個元件, 你也加不進去


一般來說如果您已經確認您的系統中已經安裝了 Windows Media Player,但仍然無法找到 AxWMPLib.AxWindowsMediaPlayer 類型,您可以嘗試手動將其添加到您的專案中。您可以從以下位置中的 Windows 系統目錄中尋找 AxWMPLib.dll 檔案:
C:\Windows\System32\AxWMPLib.dll


因為你根本就沒有那個檔案

AxWMPLib.dll 是 Windows Media Player 的一部分,它通常隨著 Windows 系統一起安裝。因此,通常情況下您不需要進行任何額外的安裝就可以在系統中找到這個檔案。

如果您無法在 C:\Windows\System32\ 路徑中找到 AxWMPLib.dll,您可以嘗試重新安裝 Windows Media Player。您可以從 Microsoft 官方網站下載 Windows Media Player 的最新版本,然後按照安裝向導的提示進行操作。


//----嘗試重新安裝windows media player.
微軟官方提供的步驟



以Windows 11 為例:
Step1:

Step2:

這個按下去之後, 會跳提示, 不用猶豫敲下去就對了, 之後按下確定就會開始把Windows Media Player移除
重開機之後, 重複剛剛的畫面, 這次重新再勾起來安裝, 

安裝完後會跳出安裝成功提示如下:


發現電腦裡的Windows Media Player名稱也不一樣了

但依然這個檔案還是沒有找到dll

但我重新開這個專案之後, 我發現錯誤消失了, 而且工具箱也有出現這個Windows Media Player了


結語:
我電腦使用的環境是Windows 11 家用版
VisualStudio版本: Microsoft Visual Studio Community 2022 (64 位元) - Current 版本 17.4.4
這份錯誤排除,不見得適用所有環境

我將問題排除步驟列出:
1. 重新安裝Windows Media Player, 並且可以參考這篇: 
取得 Windows Media Player


2. 試著更換專案的目標FrameWork, 換比較低一點的版本也許有幫助, 測試中我也有從4.8.0換去4.6.2

3.做完更新後重新開機, 重新開啟專案, 可以試試看


我後來也看到, Visual 2022使用的WindowsMediaPlayer是COM元件的C:\Windows\System32\wmp.dll
感覺跟以前也不太一樣呢


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





2018年4月28日 星期六

[Xamarin] Visual Studio 2017 安裝步驟教學

這邊使用試用版的Visual Studio Professional 2017,如果你是要看Visual Studio Community 2017的安裝步驟,應該也可以作為參考XD
步驟如下:
Step1: 到Microsoft官方網站下載
直接連下面網址:
https://www.visualstudio.com/zh-hant/vs/
畫面拉到最底有三個選項
下載Visual Studio Professional 2017 Free Trial 點進去
Step2: 下載完後的檔案,就點兩下開始安裝,他會跳出提示,接著點選繼續
 Step3: 他會幫你下載一些基本的環境跟Setup,就等吧。
Step4: 好了之後,出現選單,提示你接下來要安裝哪些項目。基本上就是下左圖的 "使用.NET進行行動開發",右圖是預設的安裝項目。
Step5: 接著就等他慢慢下載安裝囉。
Step6: 安裝完之後他應該會跳出提示重新開機,就按鈕按下去讓他重開吧~~ 原則上,到這裡就已經算是完成安裝了。
把Visual Studio 2017打開,會先載入環境設定。然後出現這個畫面就算安裝完成,我們就可以進一步去選擇我們要開發的步驟啦~~~