用VS2005 C#开发Windwos Mobile 5.0的嵌入WAV音频资源文件遇到的奇怪问题

kk75183 2012-05-29 05:36:02
用VS2005 C#开发Windwos Mobile 5.0的嵌入WAV音频资源文件遇到的奇怪问题

在用VS2005写一个Windwos Mobile 5.0的程序,想播放嵌入exe文件的wav音频文件,
在项目/属性/资料里把音频文件加入,文件名为Clap
然后在public formMain()之前加入调用PlaySound的声明:

//以下定义播放声音的一些函数参数
private const UInt32 SND_SYNC = 0x00000000;
private const UInt32 SND_ASYNC = 0x00000001;
private const UInt32 SND_NODEFAULT = 0x00000002;
private const UInt32 SND_MEMORY = 0x00000004;
private const UInt32 SND_LOOP = 0x00000008;
private const UInt32 SND_NOSTOP = 0x00000010;
private const UInt32 SND_NOWAIT = 0x00002000;
private const UInt32 SND_ALIAS = 0x00010000;
private const UInt32 SND_FILENAME = 0x00020000;
private const UInt32 SND_RESOURCE = 0x00040004;

[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int PlaySound(byte[] szSound, IntPtr hMod, UInt32 flags);

之后在需要的时候调用PlaySound函数:
PlaySound(Properties.Resources.Clap, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
程序可以运行,不报错,但是就是不出声啊!
查了很久,发现 Properties.Resources.Clap很是怪异,就是说,Properties.Resources.Clap是个
字节数组,这点没有问题,甚至大小都是嵌入WAV文件大小,但是数据全部是0!我晕!
VS在干什么啊?把我要嵌入的文件数据全部清0了?微软的脑袋被驴踢了?
...全文
206 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kk75183 2012-06-04
  • 打赏
  • 举报
回复
谢谢各位兄弟的回复,按二进制读取文件我也试过,可以正常播放。现在我用另一种嵌入资源的方式解决了。就是不用项目/属性/资源的方式嵌入文件,而是在解决方案资源管理器里面把wav文件设置为“嵌入的资源”,然后使用时用 GetManifestResourceStream 来读取资源。具体操作见下面的说明。已经在moile的真机上测试通过,可以正常发出声音!
一、在解决方案资源管理器里面,找到要加入的音频wav文件,如果没有,可以用windows的资源管理器
找到这个音频wav文件,然后拖动到解决方案资源管理器里面。在这个文件上点击鼠标右键,选属性菜单,
在属性页面里找到“生产操作”选项,要选择“嵌入的资源”。

二、在文件头加入引用:
using System.Runtime.InteropServices;

三、在处理函数之前声明DLL调用以及PlaySound的参数:
private const UInt32 SND_SYNC = 0x00000000;
private const UInt32 SND_ASYNC = 0x00000001;
private const UInt32 SND_NODEFAULT = 0x00000002;
private const UInt32 SND_MEMORY = 0x00000004;
private const UInt32 SND_LOOP = 0x00000008;
private const UInt32 SND_NOSTOP = 0x00000010;
private const UInt32 SND_NOWAIT = 0x00002000;
private const UInt32 SND_ALIAS = 0x00010000;
private const UInt32 SND_FILENAME = 0x00020000;
private const UInt32 SND_RESOURCE = 0x00040004;

[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int PlaySound(byte[] szSound, IntPtr hMod, UInt32 flags);

四、程序里的使用:
程序的namespace叫做LinkGame, 音频文件是Clap.wav,代码如下:

System.Reflection.Assembly thisExe;
//调用 GetManifestResourceStream 函数时给出的 strResourceName 资源名一定要准确,例如如果文件放在 .\bin\Debug目录里,那么 strResourceName
//就要包括完整的目录名,就像以下格式:
string strResourceName = "LinkGame.bin.Debug.Clap.wav"; //这里要加上.wav扩展名
System.IO.Stream fileStream;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();

fileStream = thisExe.GetManifestResourceStream(strResourceName); //读取资源到文件流
if (fileStream == null) //如果正确读取资源,fileStream就指向音频文件数据,否则为null
return;
byte[] SoundEffectBuffer = new byte[fileStream.Length]; //定义缓冲区
fileStream.Read(SoundEffectBuffer, 0, (int)fileStream.Length); //读取数据到缓冲区
PlaySound(SoundEffectBuffer, IntPtr.Zero, SND_ASYNC | SND_MEMORY); //播放内存里的音频数据
beyondma 2012-06-01
  • 打赏
  • 举报
回复
直接放文件没问题,那还有的办法就是把那个文件按二进制读出来,然后直接写在程序里,看看能不能放.
kk75183 2012-05-31
  • 打赏
  • 举报
回复
同样的文件,非嵌入的我也试过,PlaySound播放没有问题,但是嵌入的居然读不到数据,全是0,泪奔中。。
最后一只恐龙 2012-05-30
  • 打赏
  • 举报
回复
非嵌入的没有问题,没试过嵌入的。没有VS2005了,不好试了阿
你的选择H 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
用VS2005 C#开发Windwos Mobile 5.0的嵌入WAV音频资源文件遇到的奇怪问题

在用VS2005写一个Windwos Mobile 5.0的程序,想播放嵌入exe文件的wav音频文件,
在项目/属性/资料里把音频文件加入,文件名为Clap
然后在public formMain()之前加入调用PlaySound的声明:

//以下定义播放声音的一些函……
[/Quote]
LZ很愤慨啊
伤身啊

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧