A simple class to play sound on netcf (part 2)

在实际测试中发现上一片文章(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); 
            }

        }

    }


}



原文地址:https://www.cnblogs.com/swnuwangyun/p/556822.html