1

You can play a system sound as follows:

SystemSounds.Asterisk.Play();

But it plays asynchronously. This is usually ok, but I want to wait for it to complete, and then run some other code afterwards. How to do this?

1800 INFORMATION
  • 131,367
  • 29
  • 160
  • 239
  • Did you just ask a question and then immediately answer it yourself? – mr.coffee Mar 20 '19 at 22:11
  • 2
    @mr.coffee yes this is valid to do. When you create the question, below the edit box there is a check box to allow you to add an answer to the question at that time. I sometimes do this when I've figured out something that I couldn't find the answer to. – 1800 INFORMATION Mar 26 '19 at 23:03

1 Answers1

2

This is not the only solution, but it's what I came up with.

You can do this using the PlaySound API (https://learn.microsoft.com/en-us/previous-versions/dd743680(v%3Dvs.85)).

Use DllImport to bring in the reference:

internal static class Win32
{
    [DllImport("winmm.dll", SetLastError = true)]
    public static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);

    [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
    }
}

Then your code to call it:

Win32.PlaySound("SystemAsterisk", UIntPtr.Zero, (uint)(Win32.SoundFlags.SND_ALIAS | Win32.SoundFlags.SND_NODEFAULT));
1800 INFORMATION
  • 131,367
  • 29
  • 160
  • 239