class Media
{
[DllImport("winmm.dll", SetLastError = true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);
[DllImport("winmm.dll", SetLastError = true)]
static extern long mciSendString(string strCommand,
StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
[DllImport("winmm.dll")]
private static extern long sndPlaySound(string lpszSoundName, long uFlags);
[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
}
public static void Play(string strFileName)
{
PlaySound(strFileName, UIntPtr.Zero,
(uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_SYNC | SoundFlags.SND_NOSTOP));
}
public static void mciPlay(string strFileName)
{
/*
* open device_name type device_type alias device_alias 打开设备
* device_name 要使用的设备名,通常是文件名。
* type device_type 设备类型,例如mpegvideo或waveaudio,可省略。
* alias device_alias 设备别名,指定后可在其他命令中代替设备名。
*/
string playCommand = string.Format("open \"{0}\" alias MyWav",strFileName);
mciSendString(playCommand, null, 0, IntPtr.Zero);
/*
* play device_alias from pos1 to pos2 wait repeat 开始设备播放
* 若省略from则从当前磁道开始播放。
* 若省略to则播放到结束。
* 若指明wait则等到播放完毕命令才返回。即指明wait会产生线程阻塞,直到播放完毕
* 若指明repeat则会不停的重复播放。
* 若同时指明wait和repeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。
*/
mciSendString("play MyWav wait", null, 0, IntPtr.Zero);
/*
* close 关闭设备
*/
mciSendString("close MyWav", null, 0, IntPtr.Zero);
}
public static void sndPlay(string strFileName)
{
sndPlaySound(strFileName, (long)(SoundFlags.SND_SYNC | SoundFlags.SND_FILENAME | SoundFlags.SND_NOSTOP));
}
}
C# 播放声音文件
最新推荐文章于 2023-09-05 10:28:30 发布