Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
To create a page in a module other than winmm, prefix the name with the module name and a period.
<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
Notes:
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>The pszSound parameter is an application-specific alias in the registry. You can combine this flag with the SND_ALIAS or SND_ALIAS_ID flag to specify an application-defined sound alias.</summary>
SND_APPLICATION = 0x80,
/// <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>
''' The pszSound parameter is an application-specific alias in
''' the registry. You can combine this flag with the SND_ALIAS
''' or SND_ALIAS_ID flag to specify an application-defined sound
''' alias.
''' </summary>
SND_APPLICATION = &H80
''' <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
Tips & Tricks:
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.
Sample Code:
C#:
public static void Play (string strFileName)
{
PlaySound (strFileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC));
}
public static void Play (byte[] waveData) //bad idea, see http://blogs.msdn.com/larryosterman/archive/2009/02/19/playsound-xxx-snd-memory-snd-async-is-almost-always-a-bad-idea.aspx
{
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()) //bad idea, see http://blogs.msdn.com/larryosterman/archive/2009/02/19/playsound-xxx-snd-memory-snd-async-is-almost-always-a-bad-idea.aspx
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
Alternative Managed API:
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:
helpful tips or sample code to share for using this API in managed code?
corrections to the existing content?
variations of the signature you want to share?
additional languages you want to include?
Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).