PlaySound

PlaySound

PlaySound是Windows用於播放音樂的API函式(方法)。在vs2010以上版本需要加入#pragma comment(lib, "winmm.lib")才能使用PlaySound。 PlaySound函式原型為 BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound)。 PlaySound參數,pszSound是指定了要播放聲音的字元串,該參數可以是WAVE檔案的名字,或是WAV資源的名字,或是記憶體中聲音數據的指針,或是在系統註冊表WIN.INI中定義的系統事件聲音。如果該參數為NULL則停止正在播放的聲音。

概況

PlaySound函式的聲明為:

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

參數hmod是應用程式的實例句柄,除非pszSound的指向一個資源標識符(即fdwSound被定義為SND_RESOURCE),否則必須設定為NULL。

參數fdwSound是標誌的組合,如下表所示。若成功則函式返回TRUE,否則返回FALSE。

使用PlaySound函式時需要在#include<windows.h>後面加上(注意:不能加在前面):

播放標誌

以及含義

SND_APPLICATION

用應用程式指定的關聯來播放聲音。

SND_ALIAS

pszSound參數指定了註冊表或WIN.INI中的系統事件的別名。

SND_ALIAS_ID

pszSound參數指定了預定義的聲音標識符。

SND_ASYNC

用異步方式播放聲音,PlaySound函式在開始播放後立即返回。

SND_FILENAME

pszSound參數指定了WAVE檔案名稱。

SND_LOOP

重複播放聲音,必須與SND_ASYNC標誌一塊使用。

SND_MEMORY

播放載入到記憶體中的聲音,此時pszSound是指向聲音數據的指針。

SND_NODEFAULT

不播放預設聲音,若無此標誌,則PlaySound在沒找到聲音時會播放預設聲音。

SND_NOSTOP

PlaySound不打斷原來的聲音播出並立即返回FALSE。

SND_NOWAIT

如果驅動程式正忙則函式就不播放聲音並立即返回。

SND_PURGE

停止所有與調用任務有關的聲音。若參數pszSound為NULL,就停止所有的聲音,否則,停止pszSound指定的聲音。

SND_RESOURCE

pszSound參數是WAVE資源的標識符,這時要用到hmod參數。

SND_SYNC

同步播放聲音,在播放完後PlaySound函式才返回。

SND_SYSTEM

如果是背景視窗,

如果這個標誌被設定,聲音是分配到音頻會議系統通知的聲音。系統音量控制程式(sndvol)顯示音量滑塊控制系統通知的聲音。設定該標誌將下控制音量滑塊。如果沒有設定該標誌,聲音是分配到默認的音頻會議的套用進程。更多信息,請參閱文檔的核心音頻API的軟體開發工具包

播放方法

在C:\WINDOWS\MEDIA目錄下有一個名為The Microsoft Sound.wav的聲音檔案,在Windows 95啟動時會播放這個聲音。下面我們用三種方法來調用PlaySound函式播出Windows 95的啟動聲音。

第一種方法是直接播出聲音檔案,相應的代碼為:

PlaySound("c:\\WINDOWS\\MEDIA\\TheMicrosoftSound.wav",NULL,SND_FILENAME|SND_ASYNC);

注意參數中的路徑使用兩個連續的反斜槓轉義代表一個反斜槓。

第二種方法是把聲音檔案加入到資源中,然後從資源中播放聲音。Visual C++支持WAVE型資源,用戶在資源視圖中單擊滑鼠右鍵並選擇Import命令,然後在檔案選擇對話框中選擇The Microsoft Sound.wav檔案,則該檔案就會被加入到WAVE資源中。假定聲音資源的ID為IDR_STARTWIN,則下面的調用同樣會輸出啟動聲音:

PlaySound((LPCTSTR)IDR_STARTWIN,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC);

////////上面的(LPCTSTR)可能需改成(LPCWSTR)

第三種方法是用PlaySound播放系統聲音,Windows啟動的聲音是由SystemStart定義的系統聲音,因此可以用下面的方法播放啟動聲音:

PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);

函式sndPlaySound的功能與PlaySound類似,但少了一個參數。函式的聲明為:

BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

除了不能指定資源名字外,參數lpszSound與PlaySound的是一樣的。參數fuSound是如何播放聲音的標誌,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的組合,這些標誌的含義與PlaySound的一樣。

可以看出,sndPlaySound不能直接播放聲音資源。要用該函式播放WAVE檔案,可按下面的方式調用:

sndPlaySound(“MYSOUND.WAV”,SND_ASYNC);

程式示例#include"stdAfx.h"#include<windows.h>#include<mmsystem.h>//加上,不然PlaySound函式無法使用#pragmacomment(lib,"WINMM.LIB")//加上,不然PlaySound函式無法使用LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT("HelloWin");HWNDhwnd;MSGmsg;WNDCLASSwndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),szAppName,MB_ICONERROR);return0;}hwnd=CreateWindow(szAppName,//windowclassnameTEXT("TheHelloProgram"),//windowcaptionWS_OVERLAPPEDWINDOW,//windowstyleCW_USEDEFAULT,//initialxpositionCW_USEDEFAULT,//initialypositionCW_USEDEFAULT,//initialxsizeCW_USEDEFAULT,//initialysizeNULL,//parentwindowhandleNULL,//windowmenuhandlehInstance,//programinstancehandleNULL);//creationparametersShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}returnmsg.wParam;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){HDChdc;PAINTSTRUCTps;RECTrect;switch(message){caseWM_CREATE:PlaySound(TEXT("TESTWAVE.wav"),NULL,SND_FILENAME|SND_ASYNC);return0;caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,▭);DrawText(hdc,TEXT("Hello,Windows98!"),-1,▭,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,wParam,lParam);}C#調用示例usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;namespaceMkSipSDK.Sound{publicclassWavPlayer{protectedconstintSND_SYNC=0x0;protectedconstintSND_ASYNC=0x1;protectedconstintSND_NODEFAULT=0x2;protectedconstintSND_MEMORY=0x4;protectedconstintSND_LOOP=0x8;protectedconstintSND_NOSTOP=0x10;protectedconstintSND_NOWAIT=0x2000;protectedconstintSND_ALIAS=0x10000;protectedconstintSND_ALIAS_ID=0x110000;protectedconstintSND_FILENAME=0x20000;protectedconstintSND_RESOURCE=0x40004;protectedconstintSND_PURGE=0x40;protectedconstintSND_APPLICATION=0x80;[DllImport("winmm")]publicstaticexternboolPlaySound(stringszSound,IntPtrhMod,intflags);///<summary>///播發wav檔案方法///</summary>///<paramname="wavFile">wav檔案路徑</param>///<paramname="repeatCount">重複次數</param>privatestaticvoidPlay(stringwavFile){PlaySound(wavFile,IntPtr.Zero,SND_FILENAME|SND_SYNC);//同步,阻塞執行緒//PlaySound(wavFile,IntPtr.Zero,SND_FILENAME|SND_ASYNC);//異步,非阻塞執行緒//PlaySound(wavFile,IntPtr.Zero,1|0x00020000|repeatCount);}///<summary>///響鈴播放///</summary>///<paramname="wavFile">wav檔案路徑</param>///<paramname="repeatCount">重複次數</param>publicstaticvoidRing(stringwavFile,intrepeatCount=3){ThreadPool.QueueUserWorkItem(delegate(objectobj){for(inti=0;i<repeatCount;i++){Play(wavFile);}});}}}

相關詞條

相關搜尋

熱門詞條

聯絡我們