首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 播放聲音完整指南:Beep、MessageBeep、PlaySound API 呼叫

     編輯:關於C語言

概述

C# 本身不提供直接播放聲音的 managed API,需透過 P/Invoke 呼叫 Windows 核心 DLL。本文整理四種常見方式,適用場景各異。

四種播放聲音方案對比

方法DLL適用場景特點
Interaction.Beep()Microsoft.VisualBasic.dll簡單提示音Managed 包裝,最簡單但僅能發出系統預設蜂鳴
MessageBeepuser32.dll系統事件聲音播放系統音效(驚嘆號、問號、錯誤等),非阻塞
Beepkernel32.dll精確頻率/持續時間可控制頻率(Hz)與持續時間(ms),同步阻塞
PlaySoundwinmm.dll播放 .wav 檔案支援檔案/資源/系統音效,非同步可選

完整代碼實現

1. Visual Basic Beep(最簡單)

// 需參考 Microsoft.VisualBasic.dll
using Microsoft.VisualBasic;

public void PlaySimpleBeep()
{
    Interaction.Beep(); // 播放系統預設提示音
}

2. MessageBeep(系統音效)


using System.Runtime.InteropServices;

public class SystemSounds
{
    // 系統音效常數
    public const uint MB_OK = 0x00000000;
    public const uint MB_ICONHAND = 0x00000010;      // 嚴重錯誤
    public const uint MB_ICONQUESTION = 0x00000020;  // 問號
    public const uint MB_ICONEXCLAMATION = 0x00000030; // 驚嘆號/警告
    public const uint MB_ICONASTERISK = 0x00000040;  // 資訊/星號

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool MessageBeep(uint uType);

    public static void PlayExclamation() => MessageBeep(MB_ICONEXCLAMATION);
    public static void PlayError() => MessageBeep(MB_ICONHAND);
}

3. Beep(精確頻率控制)


public class SpeakerBeep
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool Beep(uint dwFreq, uint dwDuration);

    // 播放指定音調(頻率 Hz,持續毫秒)
    public static void PlayTone(int frequencyHz, int durationMs)
    {
        if (frequencyHz < 37 || frequencyHz > 32767)
            throw new ArgumentOutOfRangeException(nameof(frequencyHz), "Frequency must be 37-32767 Hz");
        
        Beep((uint)frequencyHz, (uint)durationMs);
    }

    // 簡易音樂範例:Do-Re-Mi
    public static void PlayScale()
    {
        int[] notes = { 262, 294, 330, 349, 392, 440, 494, 523 }; // C4-C5
        foreach (int freq in notes)
        {
            PlayTone(freq, 300);
            Thread.Sleep(50);
        }
    }
}

4. PlaySound(播放 WAV 檔案)


public class WavePlayer
{
    [Flags]
    public enum SoundFlags : uint
    {
        SND_SYNC = 0x0000,        // 同步播放(預設)
        SND_ASYNC = 0x0001,       // 非同步播放
        SND_NODEFAULT = 0x0002,   // 找不到檔案時不播放預設音
        SND_LOOP = 0x0008,        // 循環播放(需搭配 SND_ASYNC)
        SND_FILENAME = 0x00020000, // pszSound 是檔案路徑
        SND_RESOURCE = 0x00040000, // pszSound 是資源名稱
    }

    [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool PlaySound(string pszSound, IntPtr hmod, SoundFlags fdwSound);

    // 播放檔案(非同步)
    public static void PlayFile(string filePath)
    {
        if (!File.Exists(filePath))
            throw new FileNotFoundException("Sound file not found", filePath);
        
        PlaySound(filePath, IntPtr.Zero, SoundFlags.SND_ASYNC | SoundFlags.SND_FILENAME);
    }

    // 播放嵌入資源
    public static void PlayEmbeddedResource(string resourceName)
    {
        PlaySound(resourceName, Marshal.GetHINSTANCE(typeof(WavePlayer).Module), SoundFlags.SND_ASYNC | SoundFlags.SND_RESOURCE);
    }

    // 停止所有播放
    public static void Stop() => PlaySound(null, IntPtr.Zero, SoundFlags.SND_SYNC);
}

使用範例


public class SoundDemo
{
    public void RunDemo()
    {
        // 1. 簡單提示
        SystemSounds.PlayExclamation();
        
        // 2. 自訂頻率
        SpeakerBeep.PlayTone(800, 300); // 800Hz 持續 300ms
        
        // 3. 播放 WAV 檔案
        WavePlayer.PlayFile(@"C:\Windows\Media\chord.wav");
        
        // 4. 播放音階
        SpeakerBeep.PlayScale();
    }
}

注意事項與最佳實踐

  • Beep 在遠端桌面/虛擬機可能無聲:依賴主機蜂鳴器硬體,建議改用 PlaySound
  • PlaySound 非同步模式下:檔案必須保持可存取直到播放結束,勿在 using 區塊中釋放檔案流
  • 現代替代方案:WPF 使用 System.Media.SoundPlayer;UWP/WinUI 使用 MediaPlayer;跨平台建議 NAudio 或 SkiaSharp 音訊擴充
  • 音量控制:上述 API 無音量參數,需透過 Windows Core Audio API (IAudioEndpointVolume) 控制

總結

根據需求選擇:簡單提示用 MessageBeep;精確音調用 Beep;播放聲音檔用 PlaySound;生產級應用建議封裝為 ISoundService 介面,方便測試與替換實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved