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

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

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

lblFileName——Text属性:文件地址

btnOpen——Text属性:浏览文件

btnPlay——Text属性:播放声音

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

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));
        }
    }
}

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

按钮代码
 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声音文件。

『原创』+『参考』亲手实验:使用C#在PPC中播放声音相关推荐

  1. 『原创』+『参考』使用C#在PPC的Today界面上的任务栏加入应用程序图标

    最近在做的一个项目,需要程序像桌面版的"微缩"到任务栏中,类似于QCellCore的功能.于是乎股沟.百毒一番,发现如下两篇文章提及的方法不错,并且通过我亲手实验,验证了两篇文章所 ...

  2. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  3. 微软云盘配合服务器,『原创』开源5T微软云盘搭建教程onedrive index

    前言 为什么搭建一个微软共享云盘?百度云.蓝奏云不好吗?百度云有会员限制功能,各种限制更是不少,蓝奏云速度超快,但是貌似不支持大文件.微软毕竟是大厂,可用的5T教育邮箱现在也很好搞到,之所以采用是因为 ...

  4. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  5. 『力扣刷题』5275_找出井字棋的获胜者 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5275_找出井字棋的获胜者 * 5275. 找出井字棋的获胜者 显示英文描述* 用户通过次数0* 用户尝试次数0* ...

  6. 『TopCoder 组件开发指南』

    导读: 『TopCoder 组件开发指南』 Ⅰ. 简介 TopCoder 组件开发 TopCoder 组件开发使用的语言包括Java 和C#,尽管这两种语言有较大差别,但开发过 程却非常相似.本指南将 ...

  7. 『力扣刷题』5276_不浪费原料的汉堡制作方案 解题代码

    LeetCode-cn 力扣刷题 LeetCode-cn力扣刷题目录 165周赛 5276_不浪费原料的汉堡制作方案 * 5276. 不浪费原料的汉堡制作方案 显示英文描述* 用户通过次数212* 用 ...

  8. 『力扣刷题』5238_找出给定方程的正整数解 解题代码

    html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false ...

  9. 『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备

    此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出 ...

最新文章

  1. PHP开发移动端接口(增强版)
  2. 【python】简单实现一个模板引擎
  3. 使用JSP处理用户注册和登陆
  4. 【正一专栏】从“欣欣像蓉”谈网络暴力
  5. php strrchar,php文件上传
  6. Bicolored RBS
  7. org.hibernate.annotationexception no identifier specified for entity
  8. 网络新潮文化:Wiki不完全手册
  9. 全球首款采用离心风扇/90Hz刷新率的电竞手机红魔3发布
  10. html css浮动标签,12种超酷HTML5 SVG和CSS3浮动标签效果
  11. 通向财务自由之路09_知道何时收手:如何保护你的资本
  12. 阿里云加密服务产品优势及使用场景
  13. 理顺8个版本vue的区别
  14. 普通计算机安装服务器系统安装教程,Windows Server操作系统详细安装教程
  15. 【供应链架构day5】美团供应链架构的演进之道 - 团购时代
  16. HTML表格的单元格合并
  17. 如何降低图片kb大小?教你两个快速压缩图片大小的方法!
  18. 首个Nginx windows Stable 版--轻量级Web服务器Nginx 0.7.59
  19. Linux服务 Nginx(一)
  20. STM32利用SPI读写SD卡的程序详解

热门文章

  1. 关于H3 BPM数据库如何实现排序取数据的问题
  2. lucene 高亮显示
  3. Altium Designer哪里下载和导入元件库_图文教程
  4. CKeditor自定义上传图片功能
  5. DataGridView里的Checkbox全选问题解决了!
  6. PHP常量:define和const的不同之处
  7. html 像素跟百分比,html – 将百分比宽度与边距(以像素为单位)组合起来
  8. 文件设置索引_什么样的网站结构备受搜索引擎喜爱?
  9. mysql 值到99999后不增值了_MySQL必知必会3
  10. python 参数个数 同名函数_Python——函数的参数