英創嵌入式ARM9主板采用微軟的Windows CE操作系統,可以采用eVC或者VS2005進行應用開發。C#作為一種簡單易用的編程語言工具,由于其在結構構建和API界面上的優勢,受到廣大客戶的喜愛,并為很多用戶所選用。為了讓廣大選用C#的用戶能夠方便快捷地完成應用開發,英創提供了一些C#的應用例程。一些例程我們已經提供了一些說明文檔,發表在英創網站上,它們是:
·基于WINCE平臺C#編程要點之一
·基于WINCE平臺C#編程要點之二
·使用C#進行CAN總線編程—基于WINCE平臺C#編程要點之三
·CAN接口COM組件在C#語言中的使用
·SQL CE數據庫的C#編程
·C#使用COM組件接口操作精簡ISA總線
·C#使用COM組件接口進行串口操作
·C#調用COM組件的效率分析
英創不停地根據客戶的需求添加相應的應用例程,本文將對下面兩個新的要點進行淺析說明(光盤上均有相關例程):
·使用C#播放MP3或WAV音頻文件
·如何定義和使用鍵盤熱鍵
1、使用C#播放MP3或WAV音頻文件
英創的EM9000和EM9161等嵌入式工控主板進行音頻硬件擴展后,可以支持音頻的播放,如果客戶要在應用產品中播放MP3和WAV等音頻文件,我們的例程采用了著名的第三方音頻動態鏈接庫fmodce.dll,客戶可以按照如下方法進行使用:
首先,可以在應用工程中創建一個新的音頻類文件,如sound.cs,在這個類文件里定義一個音頻類,對fmodce.dll的音頻函數進行DllImport定義,以便在應用程序中可以調用:
public static IntPtr GetStream(string filename) // 獲得音頻文件的IntPtr
{
byte[] filenamebytes = System.Text.Encoding.Default.GetBytes(filename + null);
GCHandle hfile = GCHandle.Alloc(filenamebytes, GCHandleType.Pinned);
if (Environment.Version.Major == 1) return new IntPtr(hfile.AddrOfPinnedObject().ToInt32() + 4);
else return hfile.AddrOfPinnedObject();
}
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Init’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool Init(int mixrate, int maxsoftwarechannels, int flags); // 初始化
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_GetLength’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern int GetLength(IntPtr fstream); // 獲得流媒體的長度
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_GetPosition’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern UInt32 GetPosition(IntPtr fstream); // 獲得流媒體當前播放位置
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Open’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern IntPtr Open(IntPtr data, int mode, int offset, int length); // 打開音頻文件
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Play’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern int Play(int channel, IntPtr fstream); // 播放音頻文件
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_SetPosition’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool SetPosition(IntPtr fstream, UInt32 position); // 定位音頻文件播放位置
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Stream_Stop’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool Stop(IntPtr fstream); // 停止播放
[DllImport(‘fmodce.dll’, EntryPoint = ‘FSOUND_Close’, SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern void Close(); // 關閉音頻文件
[DllImport(‘coredll.dll’, SetLastError = true)]
public static extern int SetSystemPowerState(string psState, int StateFlags, int Options);
const int POWER_FORCE = 0x1000;
const int POWER_STATE_ON = 0x10000;
有了這些方便易用的音頻函數,而后就可以在應用程序里面自由操作音頻文件了。比如,播放一首songmother.mp3歌曲:
string currentSoundTrack = @‘\NandFlash\songmother.mp3’;
Sound.Init(44100, 16, 0); // 初始化為44.1kHz
IntPtr soundStream = Sound.GetStream(currentSoundTrack);
IntPtr soundHandle = Sound.Open(soundStream, 16 | 32 | 256, 0, 0);
Sound.Play(0, soundHandle);
2、如何定義和使用鍵盤熱鍵
在客戶的應用開發中,很多終端設備是使用小鍵盤相應熱鍵來執行相應的應用操作的。WinCE操作系統有很完善的消息傳遞機制,我們提供了一個熱鍵例程來說明這個過程。
首先,可以在應用工程中創建一個新的MessageWindow類文件,如MyMessageWindow.cs,以便監視鍵盤操作并作出實時響應:
class MyMessageWindow : MessageWindow
{
private Form1 msgform = null;
// 注意,程序的主窗體名稱是Form1,所以在此定義一個msgform的Form1以便接收傳遞的消息
// 下面是構造函數,注意在Form1.cs是通過
// keyUsage = new MyMessageWindow(this);彼此建立關聯的
public MyMessageWindow(Form1 msgform)
{
this.msgform = msgform;
}
protected override void WndProc(ref Message m) // 監視Windows消息
{
const int WM_HOTKEY = 0x0312; // 如果m.Msg的值為0x0312那么表示用戶按下了熱鍵
switch (m.Msg)
{
case WM_HOTKEY:
Form1.ProcessHotkey(m); // 按下熱鍵時調用Form1主窗體的ProcessHotkey()函數
break;
}
base.WndProc(ref m); // 將系統消息傳遞自父類的WndProc
}
}
在主窗體需要對Win32 API熱鍵函數進行聲明:
[DllImport(‘coredll.dll’)] // 定義一個系統范圍的熱鍵
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);
[DllImport(‘coredll.dll’)] // 在系統中注消熱鍵
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
// 下面的fsModifoers:定義為了產生WM_HOTKEY消息而必須與由nVirtKey參數定義的鍵一起按下的鍵
public enum KeyModifiers
{
None = 0, // 該鍵不按下
Alt = 1, // 該鍵為ALT鍵
Control = 2, // 該鍵為CTL鍵
Shift = 4, // 該鍵為Shift鍵
Windows = 8 // 該鍵為任意Windows鍵
}
在主窗體函數中定義熱鍵:
public Form1()
{
InitializeComponent();
keyUsage = new MyMessageWindow(this);
// 通過構造函數中參數this的傳遞,主窗體被傳入MessageWindow中,主窗體的消息循環按照新的消息循環進行
RegisterHotKey(keyUsage.Hwnd, 100, 0, Keys.D1);
// 定義熱鍵數字鍵‘1’,請注意句柄是keyUsage.Hwd(而不是Handle)
RegisterHotKey(keyUsage.Hwnd, 200, 0, Keys.D2); // 定義熱鍵數字鍵‘2’
RegisterHotKey(keyUsage.Hwnd, 300, 0, Keys.D3); // 定義熱鍵數字鍵‘3’
RegisterHotKey(keyUsage.Hwnd, 400, 0, Keys.D4); // 定義熱鍵數字鍵‘4’
}
接收MyMessageWindow傳遞過來的熱鍵消息,并作進一步處理的函數:
public static void ProcessHotkey(Message m)
{
IntPtr id = m.WParam; // IntPtr用于表示指針或句柄的平臺特定類型
string sid = id.ToString();
switch (sid)
{
case ‘100’: // 按下了熱鍵‘1’,執行action1()函數
{
action1();
break;
}
case ‘200’: // 按下了熱鍵‘2’,執行action2()函數
{
action2();
break;
}
case ‘300’: // 按下了熱鍵‘3’,執行action3()函數
{
action3();
break;
}
case ‘400’: // 按下了熱鍵‘4’,執行action4()函數
{
action4();
break;
}
}
}
那么接下來,用戶只需要在action函數里面添加自己需要進行的操作即可了。
-
WINDOWS
+關注
關注
4文章
3597瀏覽量
90678 -
嵌入式主板
+關注
關注
7文章
6094瀏覽量
36079
發布評論請先 登錄
相關推薦
英創信息技術CAN接口COM組件在C#語言領域應用

英創信息技術C#使用COM組件接口進行串口操作介紹

英創信息技術WinCE工控主板的數據庫配置簡介
英創信息技術嵌入式系統設備驅動接口的C#編程
英創信息技術嵌入式系統通訊線程的C#編程方法
英創信息技術WinCE遠程桌面介紹

英創信息技術WinCE平臺下通過系統異常信息定位程序bug位置

英創信息技術WinCE工控主板開發常見問題介紹

評論