WinFormsでサウンドを鳴らす最短ルートと実践レシピ
目次
TL;DR(用途別の選び方)
| 用途 | 対応形式 | おすすめAPI | 理由/注意 | 
|---|---|---|---|
| 通知音・簡易効果音(WAV) | WAV | System.Media.SoundPlayer | 標準・依存少・最短。Playは未ロード時に自動ロードされる。 | 
| MP3など多形式を簡単に | MP3/他 | WPFのMediaPlayer(WinFormsから参照) | 追加参照でシンプルに多形式対応。先頭から再生したい時はPosition=TimeSpan.Zero。 | 
| 連続再生・ループ・UIにプレイヤーを出したい | MP3/他 | AxWindowsMediaPlayer(COM) | ループ等が手軽。COM参照が必要。 | 
| 音量制御・ミキシング等の高度機能 | 多形式 | NAudio | 柔軟・拡張性大。NuGetで導入。 | 
最短で動かす(WAV):SoundPlayer
using System;
using System.Media;
using System.Windows.Forms;
public partial class Form1 : Form
{
    Button btn;
    public Form1()
    {
        btn = new Button { Text = "Play WAV" };
        btn.Click += (_, __) =>
        {
            using var player = new SoundPlayer(@"fanfare.wav");
            // 最短なら Load 省略でも OK(Play が未ロード時にロードを行う)
            player.Play();
        };
        Controls.Add(btn);
    }
}
- SoundPlayer.Play() は、まだロードされていなければ内部でロードして再生します。
 - 一部環境(Windows 11 のセキュリティ設定)で using + Load + Play の組み合わせで不安定になる事例があるため、Loadを省略してPlayだけにすると回避できたという知見があります(観察事例)。
- なお、これは環境依存の挙動です。まずは上記の最短コードで問題ないか確認してください。
 
 
参考:SoundPlayer クラス(Microsoft Learn)。
MP3 をシンプルに鳴らす:WPF の MediaPlayer を併用
WinForms プロジェクトに PresentationCore / PresentationFramework / WindowsBase を参照追加して使います。
using System;
using System.Windows.Forms;
using System.Windows.Media; // WPF
public partial class Form1 : Form
{
    Button btn;
    MediaPlayer _player;
    public Form1()
    {
        btn = new Button { Text = "Play MP3" };
        btn.Click += (_, __) =>
        {
            // 先頭から再生したい場合は毎回位置をリセット
            _player.Position = TimeSpan.Zero;
            _player.Play();
        };
        Controls.Add(btn);
        // 事前に開いておくとクリック遅延が減る
        _player = new MediaPlayer();
        _player.Open(new Uri(@"sound.mp3", UriKind.Relative));
    }
}
- 多形式(MP3 など)に対応。
 - 「都度Openせず毎回先頭から鳴らす」には、上記のように一度Openしておき、クリック時にPosition=TimeSpan.Zeroが手軽。 参考:MediaPlayer クラス(Microsoft Learn)。
 
注意:一部環境でフォームの見た目が微妙に変わる等の副作用を避けたい場合、次の AxWindowsMediaPlayer も選択肢です。
ループやUI組み込みを手軽に:AxWindowsMediaPlayer(COM)
- ツールボックスに「Windows Media Player」を追加(COM コンポーネント)
 - いったんフォームにドラッグ&ドロップして参照(AxWMPLib / WMPLib)を追加
 - コードから生成して使う(UIに表示しなくても可)
 
using System;
using System.Windows.Forms;
using AxWMPLib;
public partial class Form1 : Form
{
    Button btn;
    AxWindowsMediaPlayer _wmp;
    public Form1()
    {
        btn = new Button { Text = "Loop Play" };
        btn.Click += (_, __) =>
        {
            _wmp.URL = "sound.mp3";
            _wmp.settings.setMode("loop", true);
            _wmp.Ctlcontrols.play();
        };
        Controls.Add(btn);
        _wmp = new AxWindowsMediaPlayer();
        _wmp.CreateControl(); // 重要:コントロール初期化
    }
}
「1回だけ再生(ループしない)」なら、setMode(“loop", false) にするか、その行自体を削除すればOKです。前回ループONにしていた場合は設定が残るので、明示的にOFFしておくのが安全です。
btn.Click += (_, __) =>
{
    _wmp.URL = "sound.mp3";
    _wmp.settings.setMode("loop", false); // ← ループOFF
    _wmp.Ctlcontrols.play();
};
ボタンを分けたいなら、例えばこう:
var btnOnce = new Button { Text = "Play Once", Left = 100 };
btnOnce.Click += (_, __) =>
{
    _wmp.settings.setMode("loop", false);
    _wmp.URL = "sound.mp3";
    _wmp.Ctlcontrols.play();
};
Controls.Add(btnOnce);
(補足)過去にtrueにしているとそのままループし続けるので、「ループしない」動作を保証したいときは毎回 false をセットしてください。
- ループ再生などの操作が容易。
 
高度機能(音量・ミキシング等):NAudio
NuGet で NAudio を追加して利用します。
using System;
using System.Windows.Forms;
using NAudio.Wave;
public partial class Form1 : Form
{
    Button btn;
    WaveOutEvent _out = new();
    AudioFileReader? _reader;
    public Form1()
    {
        btn = new Button { Text = "Play via NAudio" };
        btn.Click += (_, __) =>
        {
            _reader?.Dispose();
            _reader = new AudioFileReader("sound.mp3"); // WAV/MP3 等OK
            _out.Init(_reader);
            _out.Play();
        };
        Controls.Add(btn);
    }
}
- 多形式・音量制御・ミキシングなどが柔軟。ライブラリの更新も活発。
 
よくある落とし穴と対処
- ファイルパスが通らない
- 開発中は fanfare.wav などをプロジェクトに追加し、「出力ディレクトリにコピー」=「常にコピー/新しい場合はコピー」にしておくと相対パスで扱いやすい。
 
 - 毎回のクリックで先頭から鳴らしたい
- MediaPlayer.Position = TimeSpan.Zero、AxWindowsMediaPlayer.settings.setMode(“loop", true)(ループ時)などを利用。
 
 - SoundPlayer で Load 周りが不安定
- まずは Play() のみで試す。環境依存の事象がある(観察知見)。
 
 - UIが固まる
- SoundPlayer.PlaySync() は同期再生でブロックします。通常は Play() を用いる。(API仕様は Microsoft Learn を参照)
 
 
参考
- 元記事(構成・知見の出典):「WinFormsアプリケーションでのサウンド再生方法」(最終更新 2024-08-29)。
 - SoundPlayer(Microsoft Learn)。Play が未ロード時にロードすること等の仕様。
 - MediaPlayer(Microsoft Learn)。WPF メディア再生。
 - NAudio(GitHub)。
 
変更点サマリ(再構成方針)
- 「最短で鳴らす」→「目的別の選び方」→「具体レシピ」→「落とし穴」の一本線導線に整理。
 - MP3の最短手段として WPF MediaPlayer の「事前Open+Positionリセット」パターンを明確化。
 - SoundPlayer.Load 省略に関する環境依存の注意を観察知見として分離記述。
 
訪問数 62 回, 今日の訪問数 1回






ディスカッション
コメント一覧
まだ、コメントがありません