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
- 指定:要播放聲音的字元串
- 參數:為NULL則停止正在播放的聲音
- 分配:默認的音頻會議的套用進程
概況,播放標誌,
概況
PlaySound函式的聲明為:
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
參數fdwSound是標誌的組合,如下表所示。若成功則函式返回TRUE,否則返回FALSE。
使用PlaySound函式時需要在#include<windows.h>後面加上(注意:不能加在前面):
#include <mmsystem.h>#pragma comment(lib, "WINMM.LIB")
播放標誌
以及含義
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,&rect);DrawText(hdc,TEXT("Hello,Windows98!"),-1,&rect,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);}});}}}