| API | 頭文件 | 庫 | 特點 |
|---|---|---|---|
PlaySound | mmsystem.h | winmm.lib | 功能豐富,支持資源/內存/文件,異步/同步控制 |
sndPlaySound | mmsystem.h | winmm.lib | 較舊,僅支持文件/別名,功能受限 |
推薦使用 PlaySound。
#include
#pragma comment(lib, "winmm.lib")
// 相對路徑或絕對路徑
PlaySound(_T("sound\\alert.wav"), NULL, SND_FILENAME | SND_ASYNC);
PlaySound(_T("sound\\click.wav"), NULL, SND_FILENAME | SND_SYNC);
// 1. 導入 WAV 為自定義資源 (資源類型 "WAVE", ID: IDR_WAVE1)
// 2. 代碼加載
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_WAVE1), _T("WAVE"));
HGLOBAL hGlob = LoadResource(NULL, hRes);
LPVOID pData = LockResource(hGlob);
DWORD dwSize = SizeofResource(NULL, hRes);
PlaySound((LPCSTR)pData, NULL, SND_MEMORY | SND_ASYNC);
PlaySound(NULL, NULL, 0); // 停止所有異步播放
fuSound 參數)| 標誌 | 含義 | 常用組合 |
|---|---|---|
SND_FILENAME | 第一參數為文件路徑 | 默認行為 |
SND_RESOURCE | 第一參數為資源標識符 (需模塊句柄) | PlaySound(MAKEINTRESOURCE(ID), hInst, SND_RESOURCE|SND_ASYNC) |
SND_MEMORY | 第一參數為內存指針 (完整 WAV 數據) | 嵌入資源播放 |
SND_ASYNC | 異步播放,立即返回 | UI 不阻塞 必加 |
SND_SYNC | 同步播放,阻塞返回 | 短提示音 |
SND_LOOP | 循環播放 (需配合 SND_ASYNC) | 背景音樂 SND_ASYNC|SND_LOOP |
SND_NODEFAULT | 找不到聲音時不播放系統默認聲音 | 靜默失敗 |
SND_NOSTOP | 不中斷正在播放的聲音 | 疊加播放 |
SND_PURGE | 停止指定聲音的所有實例 | 配合 SND_ASYNC 停止循環 |
class CBgmPlayer {
bool m_playing;
public:
CBgmPlayer() : m_playing(false) {}
~CBgmPlayer() { Stop(); }
bool PlayFile(LPCTSTR pszFile, bool bLoop = true) {
Stop();
DWORD flags = SND_FILENAME | SND_ASYNC | (bLoop ? SND_LOOP : 0);
if (PlaySound(pszFile, NULL, flags)) {
m_playing = true;
return true;
}
return false;
}
bool PlayResource(UINT nResID, bool bLoop = true) {
Stop();
DWORD flags = SND_RESOURCE | SND_ASYNC | (bLoop ? SND_LOOP : 0);
if (PlaySound(MAKEINTRESOURCE(nResID), AfxGetInstanceHandle(), flags)) {
m_playing = true;
return true;
}
return false;
}
void Stop() {
if (m_playing) {
PlaySound(NULL, NULL, 0);
m_playing = false;
}
}
};
#include #pragma comment(lib, "winmm.lib") 或項目設置 → 鏈接器 → 輸入 → 附加依賴項添加 winmm.lib。winmm.lib → 鏈接錯誤 unresolved external symbol _PlaySound。SND_MEMORY → 內存壓力大。改用 SND_FILENAME 或 SND_RESOURCE。PlaySound(NULL,0,0)。GetModuleFileName 定位 EXE 目錄拼接路徑,或嵌入資源。VC 播放聲音首選 PlaySound + winmm.lib。關鍵掌握:SND_ASYNC 異步不阻塞 UI、SND_LOOP 循環背景音樂、SND_MEMORY/RESOURCE/FILENAME 三種來源、PlaySound(NULL,0,0) 停止。嵌入資源 (WAVE 類型) 實現零文件部署。複雜音頻控制 (音量、混音、MP3、3D) 需升級至 MCI/DirectSound/XAudio2/Media Foundation。