在实际测试中发现上一片文章(A simple class to play sound on netcf)中介绍的播放声音的类在pda中运行正常,但却无法在pc中工作,简单分析了一下原因,发现是dll的问题,pc和pda播放声音时用的dll不同。pc中是winmm,而pda中则是coredll,项目需要在pc和pda上都可以运行,因此加入了动态判断功能,识别程序运行在pc还是pda中,从而加载不同的dll来播放声音,下面对是该类的一个封装:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace MiniCafe.Util


{
internal class NetHelpers

{
[Flags]
public enum PlaySoundFlags : int

{

SND_SYNC = 0x0000, /**//* play synchronously (default) */

SND_ASYNC = 0x0001, /**//* play asynchronously */

SND_NODEFAULT = 0x0002, /**//* silence (!default) if sound not found */

SND_MEMORY = 0x0004, /**//* pszSound points to a memory file */

SND_LOOP = 0x0008, /**//* loop the sound until next sndPlaySound */

SND_NOSTOP = 0x0010, /**//* don't stop any currently playing sound */

SND_NOWAIT = 0x00002000, /**//* don't wait if the driver is busy */

SND_ALIAS = 0x00010000, /**//* name is a registry alias */

SND_ALIAS_ID = 0x00110000, /**//* alias is a predefined ID */

SND_FILENAME = 0x00020000, /**//* name is file name */

SND_RESOURCE = 0x00040004 /**//* name is resource name or atom */
}

[DllImport("winmm")]
public static extern bool PlaySound(string szSound, IntPtr hMod, PlaySoundFlags flags);
}
internal class NetCFHelpers

{
[Flags]
public enum PlaySoundFlags : int

{

SND_SYNC = 0x0000, /**//* play synchronously (default) */

SND_ASYNC = 0x0001, /**//* play asynchronously */

SND_NODEFAULT = 0x0002, /**//* silence (!default) if sound not found */

SND_MEMORY = 0x0004, /**//* pszSound points to a memory file */

SND_LOOP = 0x0008, /**//* loop the sound until next sndPlaySound */

SND_NOSTOP = 0x0010, /**//* don't stop any currently playing sound */

SND_NOWAIT = 0x00002000, /**//* don't wait if the driver is busy */

SND_ALIAS = 0x00010000, /**//* name is a registry alias */

SND_ALIAS_ID = 0x00110000, /**//* alias is a predefined ID */

SND_FILENAME = 0x00020000, /**//* name is file name */

SND_RESOURCE = 0x00040004 /**//* name is resource name or atom */
}

[DllImport("coredll")]
public static extern bool PlaySound(string szSound, IntPtr hMod,PlaySoundFlags flags);
}
public class Sound

{
public static void Play(string strFileName)

{
if (Framework.IsNetCF)

{
//for pda
NetCFHelpers.PlaySound(strFileName, IntPtr.Zero,
NetCFHelpers.PlaySoundFlags.SND_FILENAME | NetCFHelpers.PlaySoundFlags.SND_ASYNC);
}
else

{
//for pc
NetHelpers.PlaySound(strFileName, IntPtr.Zero,
NetHelpers.PlaySoundFlags.SND_FILENAME | NetHelpers.PlaySoundFlags.SND_ASYNC);
}
}
}

}

