直接呼叫 Windows Core Audio API (IAudioEndpointVolume) 程式碼冗長且易出錯。強烈建議使用成熟開源庫 NAudio,幾行程式碼即可實現音量控制。
Visual Studio → 工具 → NuGet 套件管理器 → 管理解決方案的 NuGet 套件 → 搜尋 NAudio → 安裝。
Install-Package NAudio
using System;
using System.Windows.Forms;
using NAudio.CoreAudioApi;
namespace VolumeControlDemo
{
public partial class MainForm : Form
{
private readonly MMDevice _defaultPlaybackDevice;
private bool _isUpdating = false;
public MainForm()
{
InitializeComponent();
// 取得預設播放裝置
var enumerator = new MMDeviceEnumerator();
_defaultPlaybackDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
// 設定 TrackBar 屬性
trackBarVolume.Minimum = 0;
trackBarVolume.Maximum = 100;
trackBarVolume.TickFrequency = 10;
trackBarVolume.Value = (int)(_defaultPlaybackDevice.AudioEndpointVolume.MasterVolumeLevelScalar * 100);
// 事件綁定
trackBarVolume.Scroll += TrackBarVolume_Scroll;
// 同步系統音量變更(可選)
_defaultPlaybackDevice.AudioEndpointVolume.OnVolumeNotification +=
(sender, e) => UpdateTrackbarFromSystem();
}
private void TrackBarVolume_Scroll(object sender, EventArgs e)
{
if (_isUpdating) return;
float volume = trackBarVolume.Value / 100f;
_defaultPlaybackDevice.AudioEndpointVolume.MasterVolumeLevelScalar = volume;
lblVolume.Text = $"音量: {trackBarVolume.Value}%";
}
private void UpdateTrackbarFromSystem()
{
if (InvokeRequired)
{
Invoke(new Action(UpdateTrackbarFromSystem));
return;
}
_isUpdating = true;
trackBarVolume.Value = (int)(_defaultPlaybackDevice.AudioEndpointVolume.MasterVolumeLevelScalar * 100);
lblVolume.Text = $"音量: {trackBarVolume.Value}%";
_isUpdating = false;
}
protected override void Dispose(bool disposing)
{
if (disposing && _defaultPlaybackDevice != null)
_defaultPlaybackDevice.Dispose();
base.Dispose(disposing);
}
}
}
| 屬性/方法 | 說明 | 範圍 |
|---|---|---|
| MasterVolumeLevelScalar | 主音量純量值 | 0.0 ~ 1.0 (對應 0% ~ 100%) |
| MasterVolumeLevel | 主音量分貝值 | 裝置支援範圍 (通常 -96dB ~ 0dB) |
| Mute | 靜音開關 | true/false |
| OnVolumeNotification | 音量變更事件 | 外部調整音量時觸發 |
// 靜音切換按鈕
private void btnMute_Click(object sender, EventArgs e)
{
_defaultPlaybackDevice.AudioEndpointVolume.Mute =
!_defaultPlaybackDevice.AudioEndpointVolume.Mute;
btnMute.Text = _defaultPlaybackDevice.AudioEndpointVolume.Mute ? "取消靜音" : "靜音";
}
// 列出所有播放裝置供選擇
private void LoadDevices()
{
var enumerator = new MMDeviceEnumerator();
var devices = enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);
comboDevices.DataSource = devices;
comboDevices.DisplayMember = "FriendlyName";
comboDevices.ValueMember = "ID";
}
private void comboDevices_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboDevices.SelectedItem is MMDevice device)
{
_defaultPlaybackDevice?.Dispose();
_defaultPlaybackDevice = device;
// 重新綁定事件與更新 UI...
}
}
使用 NAudio 控制系統音量是 C# 開發者的最佳選擇:API 直觀、記憶體安全、支援事件通知、相容性佳。只需安裝 NuGet 套件,即可專注於業務邏輯而非底層 API 細節。