DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

システムサウンドを再生する

ここでは、様々なシステムサウンドを鳴らす方法を紹介します。システムサウンドは、コントロールパネルの「サウンドとオーディオデバイスのプロパティ」の「サウンド」タブ「プログラムイベント」の「Windows」で確認、変更ができます。ここで紹介する方法で再生できるシステムサウンドは、「メッセージ(情報)」、「一般の警告音」、「メッセージ(警告)」、「システムエラー」、「メッセージ(問い合わせ)」ですが、PlaySound関数を使用した方法では、それ以外のサウンドを再生することもできます。

.NET Framework 2.0以降で、SystemSoundクラスを使用して再生する

SystemSoundsクラスに用意されているプロパティによりSystemSoundを取得して、Playメソッドでサウンドを鳴らすことができます。

SystemSoundsクラスのプロパティとそれが意味するシステムサウンドの種類は、以下のようなものです。

SystemSoundsクラスのプロパティ システムサウンドの意味
Asterisk メッセージ(情報)
Beep 一般の警告音
Exclamation メッセージ(警告)
Hand システムエラー
Question メッセージ(問い合わせ)

以下に例を示します。Playメソッドは非同期的に再生しますので、下の例をすべて実行させずに、個別に実行してください。

VB.NET
コードを隠すコードを選択
'メッセージ(情報)を鳴らす
System.Media.SystemSounds.Asterisk.Play()

'一般の警告音を鳴らす
System.Media.SystemSounds.Beep.Play()

'メッセージ(警告)を鳴らす
System.Media.SystemSounds.Exclamation.Play()

'システムエラーを鳴らす
System.Media.SystemSounds.Hand.Play()

'メッセージ(問い合わせ)を鳴らす
System.Media.SystemSounds.Question.Play()
C#
コードを隠すコードを選択
//メッセージ(情報)を鳴らす
System.Media.SystemSounds.Asterisk.Play();

//一般の警告音を鳴らす
System.Media.SystemSounds.Beep.Play();

//メッセージ(警告)を鳴らす
System.Media.SystemSounds.Exclamation.Play();

//システムエラーを鳴らす
System.Media.SystemSounds.Hand.Play();

//メッセージ(問い合わせ)を鳴らす
System.Media.SystemSounds.Question.Play();

.NET Framework 2.0以降のVB.NETで、My.Computer.Audio.PlaySystemSoundメソッドを使用して再生する

.NET Framework 2.0以降のVB.NETでは、My.Computer.Audio.PlaySystemSoundメソッドを使用することもできます。SystemSoundクラスを使った方法と根本的には全く同じです。

VB.NET
コードを隠すコードを選択
'メッセージ(情報)を鳴らす
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Asterisk)

'一般の警告音を鳴らす
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Beep)

'メッセージ(警告)を鳴らす
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Exclamation)

'システムエラーを鳴らす
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Hand)

'メッセージ(問い合わせ)を鳴らす
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Question)

Win32 APIのMessageBeep関数で再生する方法

.NET Framework 1.1以前であれば、Win32 APIのMessageBeep関数でシステムサウンドを再生します。SystemSoundクラスの内部ではMessageBeep関数が使われていますので、根本的には同じです。

VB.NET
コードを隠すコードを選択
Public Enum MessageBeepType
    SimpleBeep = -1
    MB_OK = &H0
    MB_ICONHAND = &H10
    MB_ICONQUESTION = &H20
    MB_ICONEXCLAMATION = &H30
    MB_ICONASTERISK = &H40
End Enum

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Public Shared Function MessageBeep(ByVal uType As MessageBeepType) As Boolean
End Function

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click
    'メッセージ(情報)を鳴らす
    MessageBeep(MessageBeepType.MB_ICONASTERISK)

    ''一般の警告音を鳴らす
    'MessageBeep(MessageBeepType.MB_OK)

    ''メッセージ(警告)を鳴らす
    'MessageBeep(MessageBeepType.MB_ICONEXCLAMATION)

    ''システムエラーを鳴らす
    'MessageBeep(MessageBeepType.MB_ICONHAND)

    ''メッセージ(問い合わせ)を鳴らす
    'MessageBeep(MessageBeepType.MB_ICONQUESTION)
End Sub
C#
コードを隠すコードを選択
public enum MessageBeepType : int
{
    SimpleBeep = -1,
    MB_OK = 0x00,
    MB_ICONHAND = 0x10,
    MB_ICONQUESTION = 0x20,
    MB_ICONEXCLAMATION = 0x30,
    MB_ICONASTERISK = 0x40,
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool MessageBeep(MessageBeepType uType);

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    //メッセージ(情報)を鳴らす
    MessageBeep(MessageBeepType.MB_ICONASTERISK);

    ////一般の警告音を鳴らす
    //MessageBeep(MessageBeepType.MB_OK);

    ////メッセージ(警告)を鳴らす
    //MessageBeep(MessageBeepType.MB_ICONEXCLAMATION);

    ////システムエラーを鳴らす
    //MessageBeep(MessageBeepType.MB_ICONHAND);

    ////メッセージ(問い合わせ)を鳴らす
    //MessageBeep(MessageBeepType.MB_ICONQUESTION);
}

Win32 APIのPlaySound関数で再生する方法

Win32 APIのPlaySound関数でもシステムサウンドを再生できます。PlaySound関数の1番目のパラメータに、レジストリに記述されているシステムイベントのエイリアスを指定します。PlaySound関数については、こちらをご覧ください。

VB.NET
コードを隠すコードを選択
'サウンドを再生するWin32 APIの宣言
<Flags()> _
Public Enum PlaySoundFlags
    SND_SYNC = &H0
    SND_ASYNC = &H1
    SND_NODEFAULT = &H2
    SND_MEMORY = &H4
    SND_LOOP = &H8
    SND_NOSTOP = &H10
    SND_NOWAIT = &H2000
    SND_ALIAS = &H10000
    SND_ALIAS_ID = &H110000
    SND_FILENAME = &H20000
    SND_RESOURCE = &H40004
    SND_PURGE = &H40
    SND_APPLICATION = &H80
End Enum
<System.Runtime.InteropServices.DllImport("winmm.dll", _
    CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function PlaySound(ByVal pszSound As String, _
    ByVal hmod As IntPtr, ByVal fdwSound As PlaySoundFlags) As Boolean
End Function

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click
    'メッセージ(情報)音を鳴らす
    PlaySound("SystemAsterisk", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    '一般の警告音を鳴らす
    PlaySound(".Default", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'メッセージ(警告)音を鳴らす
    PlaySound("SystemExclamation", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'システムエラー音を鳴らす
    PlaySound("SystemHand", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'メッセージ(問い合わせ)音を鳴らす
    PlaySound("SystemQuestion", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'Windowsの起動音を鳴らす
    PlaySound("SystemStart", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'Windowsの終了音を鳴らす
    PlaySound("SystemExit", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'Windowsログオン音を鳴らす
    PlaySound("WindowsLogon", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)

    'Windowsログオフ音を鳴らす
    PlaySound("WindowsLogoff", IntPtr.Zero, _
        PlaySoundFlags.SND_ALIAS Or PlaySoundFlags.SND_NODEFAULT)
End Sub
C#
コードを隠すコードを選択
[Flags]
public enum PlaySoundFlags : int
{
    SND_SYNC = 0x0000,
    SND_ASYNC = 0x0001,
    SND_NODEFAULT = 0x0002,
    SND_MEMORY = 0x0004,
    SND_LOOP = 0x0008,
    SND_NOSTOP = 0x0010,
    SND_NOWAIT = 0x00002000,
    SND_ALIAS = 0x00010000,
    SND_ALIAS_ID = 0x00110000,
    SND_FILENAME = 0x00020000,
    SND_RESOURCE = 0x00040004,
    SND_PURGE = 0x0040,
    SND_APPLICATION = 0x0080
}
[System.Runtime.InteropServices.DllImport("winmm.dll",
    CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool PlaySound(
    string pszSound, IntPtr hmod, PlaySoundFlags fdwSound);

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    //メッセージ(情報)音を鳴らす
    PlaySound("SystemAsterisk", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //一般の警告音を鳴らす
    PlaySound(".Default", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //メッセージ(警告)音を鳴らす
    PlaySound("SystemExclamation", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //システムエラー音を鳴らす
    PlaySound("SystemHand", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //メッセージ(問い合わせ)音を鳴らす
    PlaySound("SystemQuestion", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //Windowsの起動音を鳴らす
    PlaySound("SystemStart", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //Windowsの終了音を鳴らす
    PlaySound("SystemExit", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //Windowsログオン音を鳴らす
    PlaySound("WindowsLogon", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);

    //Windowsログオフ音を鳴らす
    PlaySound("WindowsLogoff", IntPtr.Zero,
        PlaySoundFlags.SND_ALIAS | PlaySoundFlags.SND_NODEFAULT);
}

以下に、私が調べた限りの、プログラムイベントの種類とそのエイリアスを表にまとめます。

プログラムイベント エイリアス
Windowsの起動 SystemStart
Windowsの終了 SystemExit
Windowsログオフ WindowsLogoff
Windowsログオン WindowsLogon
システムエラー SystemHand
システム通知 SystemNotification
ツールバーバインドの表示 ShowBand
デバイスの切断 DeviceDisconnect
デバイスの接続 DeviceConnect
デバイスの接続の失敗 DeviceFail
バッテリー切れアラーム CriticalBatteryAlarm
バッテリー低下アラーム LowBatteryAlarm
プログラムエラー AppGPFault
プログラムの起動 Open
プログラムの終了 Close
メッセージ(警告) SystemExclamation
メッセージ(情報) SystemAsterisk
メッセージ(問い合わせ) SystemQuestion
メニューコマンド MenuCommand
メニューポップアップ MenuPopup
一般の警告音 .Default
印刷完了 PrintComplete
元に戻す(拡大) RestoreUp
元に戻す(縮小) RestoreDown
最小化 Minimize
最大化 Maximize
新着メールの通知 MailBeep
選択 CCSelect

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。