首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 控制系統主音量完整實作:使用 NAudio 庫替代複雜 Windows API

     編輯:程式設計綜合問答

現代解決方案:NAudio 庫

直接呼叫 Windows Core Audio API (IAudioEndpointVolume) 程式碼冗長且易出錯。強烈建議使用成熟開源庫 NAudio,幾行程式碼即可實現音量控制。

安裝 NAudio

Visual Studio → 工具 → NuGet 套件管理器 → 管理解決方案的 NuGet 套件 → 搜尋 NAudio → 安裝。

Install-Package NAudio

完整 WinForms 實作範例

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);
        }
    }
}

關鍵 API 說明

屬性/方法說明範圍
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...
    }
}

為什麼不建議直接用 Windows API

  • 需定義大量 COM 介面(IMMDeviceEnumerator, IAudioEndpointVolume 等)
  • 記憶體管理複雜,易造成記憶體洩漏
  • 錯誤處理繁瑣(HRESULT 檢查)
  • 32/64 位元相容性問題
  • NAudio 內部已封裝完整處理,經過大量專案驗證

總結

使用 NAudio 控制系統音量是 C# 開發者的最佳選擇:API 直觀、記憶體安全、支援事件通知、相容性佳。只需安裝 NuGet 套件,即可專注於業務邏輯而非底層 API 細節。

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