Drink Pepsi!
[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(byte[] pszSound, IntPtr hmod, SoundFlags fdwSound);
<DllImport("winmm.dll")> _
Shared Function PlaySound( _
ByVal szSound As String, _
ByVal hModule As UIntPtr, _
ByVal fdwSound As Integer) As Integer
End Function
Or
Public Declare Auto Function PlaySound Lib "winmm.dll" (ByVal pszSound As String, ByVal hmod As IntPtr, ByVal fdwSound As Integer) As Boolean
Public Declare Auto Function PlaySound Lib "winmm.dll" (ByVal pszSound As Byte(), ByVal hmod As IntPtr, ByVal fdwSound As SoundFlags) As Boolean
You will need these flags for the fdwSound parameter
C#:
[Flags]
public enum SoundFlags
{
/// <summary>play synchronously (default)</summary>
SND_SYNC = 0x0000,
/// <summary>play asynchronously</summary>
SND_ASYNC = 0x0001,
/// <summary>silence (!default) if sound not found</summary>
SND_NODEFAULT = 0x0002,
/// <summary>pszSound points to a memory file</summary>
SND_MEMORY = 0x0004,
/// <summary>loop the sound until next sndPlaySound</summary>
SND_LOOP = 0x0008,
/// <summary>don't stop any currently playing sound</summary>
SND_NOSTOP = 0x0010,
/// <summary>Stop Playing Wave</summary>
SND_PURGE = 0x40,
/// <summary>don't wait if the driver is busy</summary>
SND_NOWAIT = 0x00002000,
/// <summary>name is a registry alias</summary>
SND_ALIAS = 0x00010000,
/// <summary>alias is a predefined id</summary>
SND_ALIAS_ID = 0x00110000,
/// <summary>name is file name</summary>
SND_FILENAME = 0x00020000,
/// <summary>name is resource name or atom</summary>
SND_RESOURCE = 0x00040004
}
VB.NET:
<Flags()> _
Public Enum SoundFlags As Integer
''' <summary>
''' The sound is played synchronously, and PlaySound returns after
''' the sound event completes. This is the default behavior.
''' </summary>
SND_SYNC = &H0
''' <summary>
''' The sound is played asynchronously and PlaySound returns
''' immediately after beginning the sound. To terminate an
''' asynchronously played waveform sound, call PlaySound with
''' pszSound set to NULL.
''' </summary>
SND_ASYNC = &H1
''' <summary>
''' No default sound event is used. If the sound cannot be found,
''' PlaySound returns silently without playing the default sound.
''' </summary>
SND_NODEFAULT = &H2
''' <summary>
''' The pszSound parameter points to a sound loaded in memory.
''' </summary>
SND_MEMORY = &H4
''' <summary>
''' The sound plays repeatedly until PlaySound is called again
''' with the pszSound parameter set to NULL. If this flag is
''' set, you must also set the SND_ASYNC flag.
''' </summary>
SND_LOOP = &H8
''' <summary>
''' The specified sound event will yield to another sound event
''' that is already playing. If a sound cannot be played because
''' the resource needed to generate that sound is busy playing
''' another sound, the function immediately returns False without
''' playing the requested sound.
''' </summary>
''' <remarks>If this flag is not specified, PlaySound attempts
''' to stop the currently playing sound so that the device can
''' be used to play the new sound.
''' </remarks>
SND_NOSTOP = &H10
''' <summary>
''' Stop playing wave
''' </summary>
SND_PURGE = &H40
''' <summary>
''' If the driver is busy, return immediately without playing
''' the sound.
''' </summary>
SND_NOWAIT = &H2000
''' <summary>
''' The pszSound parameter is a system-event alias in the
''' registry or the WIN.INI file. Do not use with either
''' SND_FILENAME or SND_RESOURCE.
''' </summary>
SND_ALIAS = &H10000
''' <summary>
''' The pszSound parameter is a file name. If the file cannot be
''' found, the function plays the default sound unless the
''' SND_NODEFAULT flag is set.
''' </summary>
SND_FILENAME = &H20000
''' <summary>
''' The pszSound parameter is a resource identifier; hmod must
''' identify the instance that contains the resource.
''' </summary>
SND_RESOURCE = &H40004
End Enum
To play a sound looping both SND_LOOP and SND_ASYNC flags have to be specified. Looped sounds only stop when PlaySound is called with pszSound set to NULL.
C#:
public static void Play (string strFileName)
{
PlaySound (strFileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC));
}
public static void Play (byte[] waveData)
{
PlaySound (waveData, IntPtr.Zero, PlayFlags.SND_ASYNC | PlayFlags.SND_MEMORY);
}
private void button2_Click(object sender, System.EventArgs e)
{
UIntPtr ip = UIntPtr.Zero;
bool result = PlaySound(@"C:\path\to\wav\file.wav" ,ip ,0);
}
VB.NET:
Public Shared Sub Play(ByVal strFileName As String)
PlaySound(strFileName, IntPtr.Zero, SoundFlags.SND_FILENAME Or SoundFlags.SND_ASYNC)
End Sub
Public Shared Sub Play(ByVal waveData As Byte())
PlaySound(waveData, IntPtr.Zero, SoundFlags.SND_ASYNC Or SoundFlags.SND_MEMORY)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ip As UIntPtr = UIntPtr.Zero
Dim result As Boolean = PlaySound("C:\path\to\wav\file.wav", IntPtr.Zero, ip)
End Sub
In .Net 2.0 you can use the System.Media.SoundPlayer class instead:
SoundPlayer sound = new SoundPlayer(@"C:\Windows\Media\tada.wav");
sound.Load(); // can also be called asychronously i.e. LoadAsync()
sound.Play(); // default is to play asyncronously
In .Net Framework 2.0 and up you can use the My keyword instead of this P/Invoke method:
My.Computer.Audio.Play("C:\path\to\wav\file.wav")
Or you can play a system specific sound:
My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)