英创嵌入式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 +关注
关注
3文章
2813浏览量
85476 -
嵌入式主板 +关注
关注
7文章
5992浏览量
33493
发布评论请先 登录
相关推荐
软通动力入选“科创中国”信息技术服务创新服务团
信息技术设备产品如何办理3C认证
英创信息技术WiFi/4G/GPRS无线通信介绍

英创信息技术EM9161工控主板介绍

英创信息技术基于英创主板快速构建整机应用方案简介

英创信息技术工控主板扩展高精度时钟方案(WinCE)简介

英创信息技术精简ISA总线WinCE编程简介

英创信息技术WinCE文件系统测试及故障分析简介

英创信息技术WinCE平台高速WiFi实现方法
英创信息技术ESMARC工控主板升级简介

英创信息技术WinCE6系统CEDB故障分析介绍

英创信息技术Linux双进程应用示例

英创信息技术工控主板产品选型指南介绍
英创信息技术WinCE桌面隐藏工具DH使用简介
英创信息技术WinCE工控主板对音频播放的支持

英创信息技术WinCE主板多网络优先级设置介绍

英创信息技术WinCE主板与STM32多功能模块通讯介绍
英创信息技术JAVA操作英创主板SPI接口简介

英创信息技术JAVA操作英创主板I2C接口简介

英创信息技术WinCE工控主板4G/3G/GPRS通用拨号介绍

英创信息技术获取英创Linux主板型号的方法简介

英创信息技术WinCE工控主板在线更新开机画面(2019版)

英创信息技术串口WiFi在WinCE工控主板上的编程方法

英创信息技术新CAN驱动接口调用方法及说明

英创信息技术ESM6800与ESM928x的区别介绍
英创信息技术WinCE工控主板开发常见问题介绍

英创信息技术WinCE主板CAN接口数据接收性能测试介绍

英创信息技术工控主板大容量U盘SD卡支持情况测试

英创信息技术Windows Embedded Compact 2013 3G连接介绍
英创信息技术应用程序助手AppHelper使用介绍

英创信息技术WinCE主板对客户专用LCD的支持(2017新版)介绍

英创信息技术WinCE检测CPU负载及内存占用介绍

英创信息技术主板WinCE应用程序的FTP远程更新介绍

英创信息技术WinCE平台下通过系统异常信息定位程序bug位置

英创信息技术WEC7电容触摸屏多点触摸简介

英创信息技术C/C#开发基于WEC7的CAN通讯介绍

英创信息技术Linux工控主板支持3G网卡介绍

英创信息技术嵌入式Linux主板Qt串口应用程序简介

英创信息技术WinCE工控主板的步进电机控制介绍

英创信息技术Qt开发环境的搭建介绍

英创信息技术工控主板EM335x主要技术指标介绍

英创信息技术EM9380工控主板实时控制应用介绍
英创信息技术WinCE远程桌面介绍

英创信息技术WinCE应用程序启动触摸屏较准功能

英创信息技术EM9280的GPIO特色及应用简介
英创信息技术工控主板USB驱动安装说明

英创信息技术工控主板USB通信方案介绍

英创信息技术主板EM9280的主要技术指标简介
英创信息技术WinCE设备动态链接库的制作与调用

英创信息技术的整机产品安全性分析
英创信息技术Windows 7下嵌入式系统开发介绍
英创信息技术WinCE工控主板开发工具综述
英创信息技术嵌入式系统设备驱动接口的C#编程
英创信息技术嵌入式系统通讯线程的C#编程方法
英创信息技术嵌入式主板EM9170介绍
英创信息技术C#启动和关闭外部进程的方法介绍
英创信息技术ISA总线扩展定时器的应用介绍

英创信息技术ARM9工控主板的SMS短信息应用介绍
英创信息技术WinCE工控主板的数据库配置简介
英创信息技术C#通过串口读取GPS模块定位数据的方法

英创信息技术工控主板EM9160对红外通讯用途介绍

英创信息技术C#使用VS2005提供的串口类进行串口操作介绍

英创信息技术英创工控主板支持电力终端标准显示介绍

英创信息技术英创工控主板可编程时钟的应用介绍

英创信息技术WinCE下自动启动多个应用程序介绍

英创信息技术WinCE主板应用程序的自动启动介绍

英创信息技术C#调用COM组件的效率分析概述

英创信息技术工控主板的复位管理介绍

英创信息技术C#使用COM组件接口进行串口操作介绍

英创信息技术工控主板EM9360的GPIO介绍
英创信息技术基于WinCE的无线网卡配置教程
英创信息技术CAN接口COM组件在C#语言领域应用

英创信息技术C#使用COM组件接口操作精简ISA总线浅谈

英创信息技术ARM9主板上运行案例解析

英创信息技术ISA总线的CE设备驱动程序介绍
英创信息技术ARM9工控板在远程监控领域的应用

英创信息技术ARM9工控板串口设备的COM组件应用
英创信息技术ARM9工控主板WinCE应用程序远程控制应用
英创信息技术嵌入式主板EM9160精简ISA总线硬件中断的使用方法

英创信息技术WinCE工控主板简介

英创信息技术嵌入式工控主板EM9160的PWM功能使用方法
英创信息技术WinCE系统多串口扩展方案简介

英创信息技术VS2005调试ARM9核心板简介

英创WinCE工控主板屏幕旋转的方法

评论