博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『原创』+『参考』亲手实验:使用C#在PPC中播放声音
阅读量:4968 次
发布时间:2019-06-12

本文共 2984 字,大约阅读时间需要 9 分钟。

  今天,项目中要求用声音来提示用户程序的某个状态被激活了,发现,.Net CF下没有System.Media这种好东东鸟~,于是乎,股沟、百毒最后再来个ZZK,发现MSDN和的文章都有提及在PPC下如何播放声音(还有很多文章提到的方法差不多,但是都有网友反映不能成功播放,所以我在这里就过滤掉了),msdn中说道的文章,好多朋友反映是播放不出来,在此我没有去考证,我直接使用了小镇的代码,并且成功的播放了声音,所以,写下此篇随笔,一来做个备份,二来和大家分享一下~

首先,我们建立一个.net cf 2.0下,名称为SoundPlay的WM5 ppc项目,当然语言我选择的是C#。

然后界面设计如下:其中:

lblFileName——Text属性:文件地址

btnOpen——Text属性:浏览文件

btnPlay——Text属性:播放声音

2009091811200735.jpg

新建一个类:Sound,代码和小镇的差不多,不过我做过一小点修改,所以也贴出来,方便大家查阅:

 

ContractedBlock.gif
ExpandedBlockStart.gif
Sound
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections.Generic;
using System.Text;
namespace SoundPlay
{
    
public class Sound
    {
        
private byte[] m_soundBytes;
        
private enum Flags
        {
            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.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        
private extern static int MobilePlaySound(string szSound, IntPtr hMod, int flags);//播放外部声音文件
        [DllImport(
"CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        
private extern static int MoiblePlaySoundBytes(byte[] szSound, IntPtr hMod, int flags);//播放嵌入声音资源
        
/// <summary>
        
/// Construct the Sound object to play sound data from the specified stream.
        
/// </summary>
        public Sound(Stream stream)
        {
            
// read the data from the stream
            m_soundBytes = new byte[stream.Length];
            stream.Read(m_soundBytes, 
0, (int)stream.Length);
        }
        
/// <summary>
        
/// 从一个声音byte流构造函数Sound
        
/// </summary>
        
/// <param name="snd"></param>
        public Sound(byte[] snd)
        {
            m_soundBytes 
= snd;
        }
        
/// <summary>
        
/// 构造一个空Sound函数,此函数用于播放外部文件
        
/// </summary>
        public Sound()
        {
        }
        
/// <summary>
        
/// Play the sound File播放外部文件的Play方法
        
/// </summary>
        public void Play(string filename)
        {
            MobilePlaySound(filename, IntPtr.Zero, (
int)(Flags.SND_ASYNC | Flags.SND_FILENAME));
        }
        
/// <summary>
        
/// Play The Stream Sound,此方法应该对应从Byte和Stream构造的Sound
        
/// 注意,它的Flags设置为SND_MEMORY,因为我们的声音文件已经转换到内存中了
        
/// </summary>
        public void Play()
        {
            MoiblePlaySoundBytes(m_soundBytes, IntPtr.Zero, (
int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
        }
    }
}

 

然后,主界面上的按钮事件代码如下:

 

ContractedBlock.gif
ExpandedBlockStart.gif
按钮代码
 private void btnOpen_Click(object sender, EventArgs e)
        {
            
using (OpenFileDialog ofd = new OpenFileDialog())
            {
                
if (ofd.ShowDialog() == DialogResult.OK)
                {
                    lblFileName.Text 
= ofd.FileName;
                }
            }
        }
        
private void btnPlay_Click(object sender, EventArgs e)
        {
            Sound sound 
= new Sound();
            sound.Play(lblFileName.Text);
        }

 

够清楚了吧,经过测试,两种方式(通过流或者指定文件路径)均能播放出选中的.wav声音文件。

转载于:https://www.cnblogs.com/longqi293/archive/2009/09/18/1569112.html

你可能感兴趣的文章
使用SQLiteOpenHelper管理SD卡中的数据库
查看>>
gradient css
查看>>
javascript {}+"" 与 ""+{}
查看>>
create-react-app安装失败或者安装很慢
查看>>
转 js+cookie 购物车
查看>>
C++之运算符重载(一元)
查看>>
文件中seek的用法补充
查看>>
UPC OJ 一道水题 STL
查看>>
【转】Linxu学习---top实践
查看>>
课堂练习之《找水王》
查看>>
poj3255
查看>>
for循环
查看>>
iptables 设置肯限制流量
查看>>
cscope usage
查看>>
今天又是新的一周,把考勤做一下吧。
查看>>
特殊篮子问题——C语言暴力破解
查看>>
java环境变量的设置
查看>>
Spring 4 : 整合 SSH
查看>>
MongoDB学习笔记Day1
查看>>
[.NET] - EventSource类的使用
查看>>