『原创』+『参考』亲手实验:使用C#在PPC中播放声音
生活随笔
收集整理的這篇文章主要介紹了
『原创』+『参考』亲手实验:使用C#在PPC中播放声音
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天,項目中要求用聲音來提示用戶程序的某個狀態被激活了,發現,.Net CF下沒有System.Media這種好東東鳥~,于是乎,股溝、百毒最后再來個ZZK,發現MSDN和小鎮的文章都有提及在PPC下如何播放聲音(還有很多文章提到的方法差不多,但是都有網友反映不能成功播放,所以我在這里就過濾掉了),msdn中說道的文章,好多朋友反映是播放不出來,在此我沒有去考證,我直接使用了小鎮的代碼,并且成功的播放了聲音,所以,寫下此篇隨筆,一來做個備份,二來和大家分享一下~
首先,我們建立一個.net cf 2.0下,名稱為SoundPlay的WM5 ppc項目,當然語言我選擇的是C#。
然后界面設計如下:其中:
lblFileName——Text屬性:文件地址
btnOpen——Text屬性:瀏覽文件
btnPlay——Text屬性:播放聲音
新建一個類:Sound,代碼和小鎮的差不多,不過我做過一小點修改,所以也貼出來,方便大家查閱:
?
Soundusing?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中播放声音的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 循环神经网络实践
- 下一篇: 安装 nodejs 的版本管理工具 (n