在 Windows 應用程式開發中,加入音效能大幅提升使用者體驗。本文將詳細說明如何在 Visual C++ 專案的資源檔(.rc)中嵌入自訂聲音資源,並透過多執行緒與 MFC 資源管理 API 實現非阻塞式播放。
首先使用文字編輯器(如記事本)開啟專案的 .rc 檔案,在檔案末尾加入以下資源定義:
IDW WAVE "c:\\kav\\sound\\virus.wav"
其中 IDW 為自訂資源名稱,WAVE 為資源類型,路徑需使用雙反斜線跳脫。儲存後關閉檔案。
為避免播放聲音時凍結主介面,應另啟一執行緒處理播放邏輯:
AfxBeginThread((AFX_THREADPROC)sound, NULL, THREAD_PRIORITY_NORMAL);
核心播放流程包含四個關鍵 API 呼叫:
AfxGetInstanceHandle()FindResource(hModule, lpName, lpType)LoadResource(hModule, hResInfo)LockResource(hGlobal) 取得資料指標若任一步驟失敗,需釋放已配置資源並返回錯誤。
UINT CPlaySoundView::sound(LPVOID pParam)
{
HINSTANCE h = AfxGetInstanceHandle();
HRSRC hr = FindResource(h, "IDW", "WAVE");
HGLOBAL hg = LoadResource(h, hr);
LPSTR lp = (LPSTR)LockResource(hg);
sndPlaySound(lp, SND_MEMORY | SND_SYNC);
FreeResource(hg);
return 0;
}
此處使用 sndPlaySound 搭配 SND_MEMORY 旗標直接從記憶體播放,SND_SYNC 表示同步播放(執行緒會等待播放結束)。若需非同步播放,可改用 SND_ASYNC。
FreeResource 釋放資源控制代碼