How to: Use Platform Invoke to Play a Wave File
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer

How to: Use Platform Invoke to Play a Wave File (C# Programming Guide)

The following C# code example illustrates how to use platform invoke services to play a wave sound file on the Windows operating system.

This example code uses DllImport to import winmm.dll's PlaySound method entry point as Form1 PlaySound(). The example has a simple Windows Form with a button. Clicking the button opens a standard windows OpenFileDialog dialog box so that you can open a file to play. When a wave file is selected, it is played by using the PlaySound() method of the winmm.DLL assembly method. For more information about winmm.dll's PlaySound method, see Using the PlaySound function with Waveform-Audio Files. Browse and select a file that has a .wav extension, and then click Open to play the wave file by using platform invoke. A text box shows the full path of the file selected.

The Open Files dialog box is filtered to show only files that have a .wav extension through the filter settings:

dialog1.Filter = "Wav Files (*.wav)|*.wav";
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WinSound
    public partial class Form1 : Form
        private TextBox textBox1;
        private Button button1;

        public Form1()  //constructor

        [System.Runtime.InteropServices.DllImport("winmm.DLL", EntryPoint = "PlaySound", SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)]
        private static extern bool PlaySound(string szSound, System.IntPtr hMod, PlaySoundFlags flags);

        public enum PlaySoundFlags : int
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001, 
            SND_NODEFAULT = 0x0002, 
            SND_LOOP = 0x0008, 
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000, 
            SND_FILENAME = 0x00020000, 
            SND_RESOURCE = 0x00040004 

        private void button1_Click (object sender, System.EventArgs e)
            OpenFileDialog dialog1 = new OpenFileDialog(); 

            dialog1.Title = "Browse to find sound file to play";
            dialog1.InitialDirectory = @"c:\";
            dialog1.Filter = "Wav Files (*.wav)|*.wav";
            dialog1.FilterIndex = 2;
            dialog1.RestoreDirectory = true;

            if(dialog1.ShowDialog() == DialogResult.OK) 
                textBox1.Text = dialog1.FileName;
                PlaySound (dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_SYNC);

To compile the code

  1. Create a new C# Windows Application project in Visual Studio and name it WinSound.

  2. Copy the code above, and paste it over the contents of the Form1.cs file.

  3. Copy the following code, and paste it in the Form1.Designer.cs file, in the InitializeComponent() method, after any existing code.

    this.button1 = new System.Windows.Forms.Button();
    this.textBox1 = new System.Windows.Forms.TextBox();
    // button1 
    this.button1.Location = new System.Drawing.Point(192, 40);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(88, 24);
    this.button1.TabIndex = 0;
    this.button1.Text = "Browse";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    // textBox1 
    this.textBox1.Location = new System.Drawing.Point(8, 40);
    this.textBox1.Name = "textBox1";
    this.textBox1.Size = new System.Drawing.Size(168, 20);
    this.textBox1.TabIndex = 1;
    this.textBox1.Text = "FIle path";
    // Form1 
    this.AutoScaleDimensions = new System.Drawing.SizeF(5, 13);
    this.ClientSize = new System.Drawing.Size(292, 266);
    this.Name = "Form1";
    this.Text = "Platform Invoke WinSound C#";
  4. Compile and run the code.

For more information, see .NET Framework Security.

© 2015 Microsoft