Window media player
收藏
今天在論壇看到的文章,順便學習了一下
http://topic.csdn.net/u/20090818/14/ea5abcf0-1897-4282-b39c-58fbb21b4c33.html?38882
好多朋友提供的網站:
用VC6.0設計數位視訊播放器:http://www.pcdog.com/edu/vc/2005/12/j057824.html
自己的一個小工程實現:
http://download.csdn.net/source/1585136
[開源]用Windows Media Player控制項播放音樂圖文教程(MP3,WAV,WMV)
http://www.bccn.net/Article/net/cs/jszl/200709/6438.html
用Media Player設計個人化媒體播放器:
http://dev.yesky.com/SoftChannel/72342371928702976/20040922/1856774.shtml
最後這個網站老是自動回到首頁面,所以轉載了內容
[文章資訊] |
|
作者: |
電子科技集團公司第二十二研究所青島分所郎銳 |
時間: |
2004-09-22 |
出處: |
天極網 |
責任編輯: |
方舟 |
|
[文章導讀] |
|
本文主要介紹了對Windows Media Player控制項的使用方法,並在此基礎上完成個人化媒體播放程式的設計實現 |
摘要:本文主要介紹了對Windows Media Player控制項的使用方法,並在此基礎上完成個人化媒體播放程式的設計實現。
關鍵字:ActiveX控制項;多媒體;表單半透明;熱鍵
引言
多媒體播放軟體現在幾乎成為每一台家用電腦的裝機必備軟體,比較流行的有RealOne Player、Windows Media Player以及國產軟體金山影霸等等,通過這些軟體能夠播放RM、RMVB、MP3、MPEG、DAT等多種格式的多媒體檔案。雖然這些商業軟體在功能上已經做的相當完備,但由於其產品開發是面向大多數普通消費者的,正所謂眾口難調,這類軟體很難做到符合每一個消費者的口味。而作為一名程式員,完全可以利用自身的技術優勢來對其進行改造,以設計出為自己量身訂做的媒體播放軟體,改造後的軟體在使用時將更符合自己的使用習慣。本文即以Windows Media Player 9.0為例講述如何將其改造為個人化的媒體播放軟體。
對Windows Media Player控制項的基本控制
在安裝了Windows Media Player 9.0後,一個Windows Media Player ActiveX控制項也同時被安裝到系統並完成註冊。該控制項為開發人員提供了Windows Media Player 9.0具備的絕大部分功能,能夠通過該控制項比較輕鬆的實現對Windows Media Player 9.0的二次開發。
為使用該控制項,首先要將其添加到工程。點擊“Project”下“Add to Project”彈出的“Components and Controls…”子功能表,並從彈出對話方塊中進入“Registered ActiveX Controls”目錄尋找並添加Windows Media Player控制項到工程。這時以CWMP開頭的17個類將被添加到工程。在資源檢視中將控制項拖動到用來播放多媒體的對話方塊上並通過ClassWizard將控制項與CWMPPlayer4類對象建立關聯。CWMPPlayer4類提供了與Windows Media Player控制項進行互動的基本方法,而且部分成員函數還能夠進一步擷取得到其他相關類對象的執行個體。其中,SetUrl()和close()方法將能夠開啟和關閉指定的媒體檔案。在開啟檔案之後,能夠通過控制項上的內建按鈕控制媒體的播放、暫停、停止以及對音量的控制等。如果需要在程式中控制媒體的播放,可使用GetControls()函數返回CWMPControls類對象,並進一步調用該對象的play()、stop()、pause()、fastForward()、fastReverse()等方法來完成播放、停止、暫停、快進、快退等相應動作;如果需要在程式中對控制項屬性進行設定和更改,可在GetSettings()方法返回一個CWMPSettings類的對象後通過其成員函數來完成相應的設定,例如,下面這段代碼將把播放音量設定到最大:
m_Setting = m_WMPPlayer.GetSettings(); m_Setting.SetVolume(100); |
目前只是在視窗模式下播放媒體,大部分媒體播放軟體都提供有全屏播放功能,Windows Media Player也不例外,只需以TRUE為參數調用CWMPPlayer4類成員函數 SetFullScreen()即可,在全螢幕模式下可以通過點擊滑鼠左鍵或是從右鍵快顯功能表退回到視窗播放模式。通過對CWMPPlayer4、CWMPSettings和CWMPControls等幾個類的使用可以實現Windows Media Player的大部分常規功能,如果需要做進一步的控制,可以在用下面這些函數返回相關類對象後調用相關成員函數來加以實現:
GetCurrentMedia() 返回CWMPMedia類對象
GetMediaCollection() 返回CWMPMediaCollection類對象
GetPlaylistCollection() 返回CWMPPlaylistCollection類對象
GetNetwork() 返回CWMPNetwork類對象
GetCurrentPlaylist() 返回CWMPPlaylist類對象
GetCdromCollection() 返回CWMPCdromCollection類對象
GetClosedCaption() 返回CWMPClosedCaption類對象
GetError() 返回CWMPError類對象
GetDvd() 返回CWMPDVD類對象
GetPlayerApplication() 返回CWMPPlayerApplication類對象
熱鍵隱藏與呼出
前面介紹的各種常規功能在Windows Media Player中都已經具備,為了使設計的程式在使用方式上更適合自己,可以根據自己的需求添加一些Windows Media Player原本並不具備的個人化功能。例如,本程式下面將要添加的熱鍵迅速隱藏、呼出功能和可調半透明播放功能都是Windows Media Player所不具備的,而且就筆者這段時間的試用,感覺這兩種功能都還是相當實用的。當然,這裡要添加的既然是“個人化”功能,那麼就應當視讀者的個人喜好而決定到底要添加什麼功能。筆者此處介紹的目的僅在於拋磚引玉。
無論是金山影霸還是RealOne Player、Windows Media Player等主流媒體播放軟體都沒有提供徹底隱藏的功能,通常只能簡單的最小化至多不過縮小成任務區中的一個小表徵圖,這樣其實根本達不到隱藏的效果,如果暫時離開電腦,他人可以很容易開啟當前正在執行的媒體播放程式。這裡將要實現的目標是:程式主表單的隱藏、在工作列上的隱藏、在Alt+Tab鍵在程式間切換時的隱藏。這樣,程式在實施隱藏後他人將意識不到程式的執行,可以達到非常好的隱藏效果。由於隱藏後沒有任何視窗供使用者互動之用,因此需要添加熱鍵以在程式隱藏後能夠將其從後台呼出。
首先要在程式中註冊一個熱鍵,無論該程式在前台還是後台運行,只要使用者按下這個熱鍵,程式將立即執行在前、後台間的切換。下面這段代碼在程式初始運行時執行,通過對RegisterHotKey()的調用登記用於程式隱藏的熱鍵Ctrl + P(或Ctrl + p)和用於程式呼出的熱鍵Ctrl + Shift + A(或Ctrl + Shift + a):
// 登記熱鍵 HWND hWnd = GetSafeHwnd(); RegisterHotKey(hWnd, 1001, MOD_CONTROL | MOD_SHIFT, 'A'); RegisterHotKey(hWnd, 1002, MOD_CONTROL | MOD_SHIFT, 'a'); RegisterHotKey(hWnd, 1003, MOD_CONTROL, 'P'); RegisterHotKey(hWnd, 1004, MOD_CONTROL, 'p'); |
其中,1001、1002等參數是這些熱鍵對應的ID。在程式捕獲到熱鍵訊息WM_HOTKEY後將通過這些ID來確認按下的是哪個鍵。ClassWizard並沒有對訊息WM_HOTKEY進行封裝,需要手工添加對該訊息的映射及處理。訊息處理函數的wParam參數包含有按鍵的ID,下面是這部分實現代碼:
switch(wParam) { case 1001: case 1002: { // 呼出程式 HWND hWnd = GetSafeHwnd(); LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE); lStyle &= ~WS_POPUP; ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle); ::ShowWindow(m_hWnd, SW_SHOW); CWnd::SetForegroundWindow(); m_Control.play(); // 繼續 break; } case 1003: case 1004: { // 隱藏程式 // 隱藏程式 HWND hWnd = GetSafeHwnd(); LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE); lStyle |= WS_POPUP; ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle); ::ShowWindow(m_hWnd, SW_HIDE); m_Control.pause(); // 暫停 break; } } |
在進行表單隱藏處理時,首先通過GetWindowLong()得到當前視窗風格,在此基礎上追加WS_POPUP風格並由SetWindowLong()設定,修改後的表單將具備工具條一樣的風格,即不會在工作列顯示表單,在用Alt+Tab切換表單時也不會出現。最後再以SW_HIDE調用ShowWindow()函數隱藏程式主視窗即達到徹底隱藏的目的。表單呼出過程正與之相反:在GetWindowLong()函數得到當前視窗風格後,從中剔除WS_POPUP風格並由SetWindowLong()設定,恢複程式原有的風格,最後再以SW_SHOW調用ShowWindow()函數顯示程式主表單。最後由CWnd類成員函數SetForegroundWindow()將呼出的程式顯示到前台。
需要注意的是,在程式退出前一定要將先前註冊的熱鍵登出,由UnregisterHotKey()函數完成:
HWND hWnd = GetSafeHwnd(); UnregisterHotKey(hWnd, 1001); UnregisterHotKey(hWnd, 1002); |
表單半透明效果實現
表單半透明這一功能實際是為了滿足“一心二用”的目的而特別添加的。筆者通常在播放媒體檔案時閱讀電子書,將播放軟體佈建為最前後總是佔據不小的螢幕面積並遮擋了不少文字,使閱讀變的非常不便。因此才有了將播放軟體介面設定為半透明這一想法。
傳統的Windows應用程式想實現半透明效果,一般來說需要處理自己的視窗的WM_Paint訊息視窗,比較麻煩。在Windows 2000以上版本的作業系統中提供有一個新的API函數SetLayeredWindowAttributes(),它能很方便的將表單設定為半透明效果,其函式宣告如下:
BOOL SetLayeredWindowAttributes( HWND hwnd, // handle to the layered window COLORREF crKey, // specifies the color key BYTE bAlpha, // value for the blend function DWORD dwFlags // action ); |
其中dwFlags有LWA_ALPHA和LWA_COLORKEY兩種設定,如果LWA_ALPHA被設定的話,通過bAlpha決定透明度;如果LWA_COLORKEY被設定的話,則指定被透明掉的顏色為crKey,其他顏色則正常顯示。為了能夠使用該函數,還必須在之前添加預定義語句:
#define WS_EX_LAYERED 0x00080000 |
在用GetModuleHandle()裝載USER32.DLL模組並調用GetProcAddress()得到函數 SetLayeredWindowAttributes()在User32.dll中的指標後就可以通過SetLayeredWindowAttributes()函數將表單設定為半透明了:
// 全域變數 typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags); lpfn g_pSetLayeredWindowAttributes; …… // 擷取函數 SetLayeredWindowAttributes 在User32.dll中的指標 HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL")); g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes"); if (g_pSetLayeredWindowAttributes == NULL) ::PostQuitMessage(0); …… // 半透明 HWND hWnd = GetSafeHwnd(); LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED; ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong); g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_sldAlpha.GetPos(), 2); ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); |
為了方便控制表單的透明程度,可添加滑動條控制項對其進行控制。經過這樣的處理,就可以在播放媒體時不受打擾地繼續閱讀被其遮擋的文字了。
小結
本文通過對Windows Media Player控制項的使用實現了Windows Media Player 9.0媒體播放軟體所具備的一般功能,並以熱鍵隱藏、呼出表單和表單半透明設定為例介紹了個人化編程的一般方法。讀者可以根據需要以類似的方式通過對其他軟體提供的控制項如Realplayer等的使用編寫支援其他格式媒體的個人化媒體播放程式。本文所述程式在Windows 2000 Professional 下由Microsoft Visaul C++ 6.0編譯調試通過,程式運行環境需要預先安裝Windows Media Player 9.0。